<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/LMF2015/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rocrodhue</id>
	<title>Lógica matemática y fundamentos (2014-15) - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/LMF2015/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rocrodhue"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php/Especial:Contribuciones/Rocrodhue"/>
	<updated>2026-07-18T18:42:41Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_4&amp;diff=223</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_4&amp;diff=223"/>
		<updated>2015-03-28T11:55:09Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang =&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R4: Deducción natural de primer orden *}&lt;br /&gt;
&lt;br /&gt;
theory R4&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores y de la igualdad: &lt;br /&gt;
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  · conjunct1:  P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:  P ∧ Q ⟹ Q  &lt;br /&gt;
  · notnotD:    ¬¬ P ⟹ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · impI:       (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · disjI1:     P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2:     Q ⟹ P ∨ Q&lt;br /&gt;
  · disjE:      ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
  · FalseE:     False ⟹ P&lt;br /&gt;
  · notE:       ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · notI:       (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · iffI:       ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  · iffD1:      ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2:      ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
  · ccontr:     (¬P ⟹ False) ⟹ P&lt;br /&gt;
  · excluded_middel:(¬P ∨ P) &lt;br /&gt;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀x. P x) ⟹ ∀x. P x&lt;br /&gt;
  · exI:        P x ⟹ ∃x. P x&lt;br /&gt;
  · exE:        ⟦∃x. P x; ⋀x. P x ⟹ Q⟧ ⟹ Q&lt;br /&gt;
&lt;br /&gt;
  · refl:       t = t&lt;br /&gt;
  · subst:      ⟦s = t; P s⟧ ⟹ P t&lt;br /&gt;
  · trans:      ⟦r = s; s = t⟧ ⟹ r = t&lt;br /&gt;
  · sym:        s = t ⟹ t = s&lt;br /&gt;
  · not_sym:    t ≠ s ⟹ s ≠ t&lt;br /&gt;
  · ssubst:     ⟦t = s; P s⟧ ⟹ P t&lt;br /&gt;
  · box_equals: ⟦a = b; a = c; b = d⟧ ⟹ a: = d&lt;br /&gt;
  · arg_cong:   x = y ⟹ f x = f y&lt;br /&gt;
  · fun_cong:   f = g ⟹ f x = g x&lt;br /&gt;
  · cong:       ⟦f = g; x = y⟧ ⟹ f x = g y&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI y mt que demostramos a continuación.&lt;br /&gt;
  *}&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       ∀x. P x ⟶ Q x ⊢ (∀x. P x) ⟶ (∀x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. P x) ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  { fix a&lt;br /&gt;
    have &amp;quot;P a ⟶ Q a&amp;quot; using assms by (rule allE)&lt;br /&gt;
    have &amp;quot;P a&amp;quot; using `∀x. P x` by (rule allE)&lt;br /&gt;
    have &amp;quot;Q a&amp;quot; using `P a ⟶ Q a` `P a` by (rule mp)}&lt;br /&gt;
thus &amp;quot;∀x. Q x&amp;quot; by (rule allI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-María Dolores Mateo&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
       ∃x. ¬(P x) ⊢ ¬(∀x. P x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2a: &lt;br /&gt;
  assumes &amp;quot;∃x. ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. P x)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;∀x. P x&amp;quot; &lt;br /&gt;
  obtain a where &amp;quot;¬ (P a)&amp;quot; using assms by (rule exE)&lt;br /&gt;
  have &amp;quot;P a&amp;quot; using `∀x. P x` by (rule allE)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using `¬ (P a)` `P a` by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-María Dolores Mateo&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
       ∀x. P x ⊢ ∀y. P y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀y. P y&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
{ fix a&lt;br /&gt;
  show &amp;quot;P a&amp;quot; using assms by (rule allE)}&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-María Dolores Mateo&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
       ∀x. P x ⟶ Q x ⊢ (∀x. ¬(Q x)) ⟶ (∀x. ¬ (P x))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. ¬(Q x)) ⟶ (∀x. ¬ (P x))&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;∀x. ¬(Q x)&amp;quot;&lt;br /&gt;
  { fix a&lt;br /&gt;
    have &amp;quot;P a ⟶ Q a&amp;quot; using assms by (rule allE)&lt;br /&gt;
    have &amp;quot;¬ (Q a)&amp;quot; using `∀x. ¬(Q x)` by (rule allE)&lt;br /&gt;
    have &amp;quot;¬(P a)&amp;quot; using `P a ⟶ Q a` `¬ (Q a)` by (rule mt)}&lt;br /&gt;
thus &amp;quot;∀x. ¬ (P x)&amp;quot; by (rule allI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-María Dolores Mateo&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
       ∀x. P x  ⟶ ¬(Q x) ⊢ ¬(∃x. P x ∧ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5: &lt;br /&gt;
  assumes &amp;quot;∀x. P x  ⟶ ¬(Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∃x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;∃x. P x ∧ Q x&amp;quot; &lt;br /&gt;
  obtain a where &amp;quot;P a ∧ Q a&amp;quot; using `∃x. P x ∧ Q x` by (rule exE)&lt;br /&gt;
  have &amp;quot;P a&amp;quot; using `P a ∧ Q a` by (rule conjE)&lt;br /&gt;
  have &amp;quot;Q a&amp;quot; using `P a ∧ Q a` by (rule conjE)&lt;br /&gt;
  have &amp;quot;P a  ⟶ ¬(Q a)&amp;quot; using assms by (rule allE)&lt;br /&gt;
  have &amp;quot;¬(Q a)&amp;quot; using `P a  ⟶ ¬(Q a)` `P a` by (rule mp)&lt;br /&gt;
show &amp;quot;False&amp;quot; using `¬(Q a)` `Q a` by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-María Dolores Mateo&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
       ∀x y. P x y ⊢ ∀u v. P u v&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6: &lt;br /&gt;
  assumes &amp;quot;∀x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀u v. P u v&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof (rule allI)+&lt;br /&gt;
fix a b &lt;br /&gt;
have  &amp;quot;∀y. P a y&amp;quot; using assms by (rule allE)&lt;br /&gt;
thus &amp;quot; P a b&amp;quot; by (rule allE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6b: &lt;br /&gt;
  assumes 1: &amp;quot;∀x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀u v. P u v&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
{fix u0 &lt;br /&gt;
 {fix v0&lt;br /&gt;
  have 2: &amp;quot;∀y. P u0 y&amp;quot; using 1  by (rule allE)&lt;br /&gt;
  have 3: &amp;quot;P u0 v0&amp;quot; using 2 by (rule allE)}&lt;br /&gt;
 then have 4: &amp;quot;∀v. P u0 v&amp;quot; by (rule allI)}&lt;br /&gt;
then show &amp;quot;∀u v. P u v&amp;quot; by (rule allI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
       ∃x y. P x y ⟹ ∃u v. P u v&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7: &lt;br /&gt;
  assumes &amp;quot;∃x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃u v. P u v&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof -&lt;br /&gt;
obtain a where &amp;quot;∃y. P a y&amp;quot; using assms by (rule exE)&lt;br /&gt;
then obtain b where &amp;quot;P a b&amp;quot; by (rule exE)&lt;br /&gt;
hence &amp;quot;∃v. P a v&amp;quot; by (rule exI)&lt;br /&gt;
thus &amp;quot;∃u v. P u v&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
       ∃x. ∀y. P x y ⊢ ∀y. ∃x. P x y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8: &lt;br /&gt;
  assumes &amp;quot;∃x. ∀y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀y. ∃x. P x y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof &lt;br /&gt;
obtain a where &amp;quot;∀y. P a y&amp;quot; using assms by (rule exE)&lt;br /&gt;
fix b &lt;br /&gt;
have &amp;quot;P a b&amp;quot; using `∀y. P a y` by (rule allE)&lt;br /&gt;
thus &amp;quot;∃x. P x b&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
       ∃x. P a ⟶ Q x ⊢ P a ⟶ (∃x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9: &lt;br /&gt;
  assumes &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;P a&amp;quot;&lt;br /&gt;
obtain b where &amp;quot;P a ⟶ Q b&amp;quot; using assms by (rule exE)&lt;br /&gt;
have &amp;quot;Q b&amp;quot; using `P a ⟶ Q b` `P a` by (rule mp)&lt;br /&gt;
thus &amp;quot;∃x. Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
       P a ⟶ (∃x. Q x) ⊢ ∃x. P a ⟶ Q x &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10a: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
       (∃x. P x) ⟶ Q a ⊢ ∀x. P x ⟶ Q a&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11a: &lt;br /&gt;
  assumes &amp;quot;(∃x. P x) ⟶ Q a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof &lt;br /&gt;
fix b&lt;br /&gt;
show &amp;quot;P b ⟶ Q a&amp;quot;  &lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;P b&amp;quot;&lt;br /&gt;
hence &amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
show &amp;quot;Q a&amp;quot; using assms `∃x. P x` by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
       ∀x. P x ⟶ Q a ⊢ ∃ x. P x ⟶ Q a&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof -&lt;br /&gt;
fix b&lt;br /&gt;
have &amp;quot;P b ⟶ Q a&amp;quot; using assms by (rule allE)&lt;br /&gt;
thus &amp;quot;∃x. P x ⟶ Q a&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
       (∀x. P x) ∨ (∀x. Q x) ⊢ ∀x. P x ∨ Q x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13a: &lt;br /&gt;
  assumes &amp;quot;(∀x. P x) ∨ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof &lt;br /&gt;
fix a&lt;br /&gt;
show &amp;quot;P a ∨ Q a&amp;quot; using assms&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
hence &amp;quot;P a&amp;quot; by (rule allE)&lt;br /&gt;
thus &amp;quot;P a ∨ Q a&amp;quot; by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
hence &amp;quot;Q a&amp;quot; by (rule allE)&lt;br /&gt;
thus &amp;quot;P a ∨ Q a&amp;quot; by (rule disjI2)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
       ∃x. P x ∧ Q x ⊢ (∃x. P x) ∧ (∃x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14a: &lt;br /&gt;
  assumes &amp;quot;∃x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. P x) ∧ (∃x. Q x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
obtain a where &amp;quot;P a ∧ Q a&amp;quot; using assms by (rule exE)&lt;br /&gt;
hence &amp;quot;P a&amp;quot; by (rule conjunct1)&lt;br /&gt;
thus &amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
have &amp;quot;Q a&amp;quot; using  `P a ∧ Q a` by (rule conjunct2)&lt;br /&gt;
thus &amp;quot;∃x. Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
       ∀x y. P y ⟶ Q x ⊢ (∃y. P y) ⟶ (∀x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15a: &lt;br /&gt;
  assumes &amp;quot;∀x y. P y ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃y. P y) ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;∃y. P y&amp;quot;&lt;br /&gt;
then obtain b where &amp;quot;P b&amp;quot; by (rule exE)&lt;br /&gt;
{fix a &lt;br /&gt;
have &amp;quot;∀y. P y ⟶ Q a&amp;quot; using assms by (rule allE)&lt;br /&gt;
hence &amp;quot;P b ⟶ Q a&amp;quot; by (rule allE)&lt;br /&gt;
have &amp;quot;Q a&amp;quot; using `P b ⟶ Q a` `P b` by (rule mp)}&lt;br /&gt;
thus &amp;quot;∀x. Q x&amp;quot; by (rule allI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
       ¬(∀x. ¬(P x)) ⊢ ∃x. P x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16a: &lt;br /&gt;
  assumes 1:&amp;quot;¬(∀x. ¬(P x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof-&lt;br /&gt;
fix x0&lt;br /&gt;
{assume 2: &amp;quot;¬(∃x. P x)&amp;quot; &lt;br /&gt;
 {fix x1&lt;br /&gt;
  {assume 3: &amp;quot;P x1&amp;quot;&lt;br /&gt;
   have 4: &amp;quot;∃x. P x&amp;quot; using 3 by (rule exI)&lt;br /&gt;
   have 5: &amp;quot;False&amp;quot; using 2 4 by (rule notE)}&lt;br /&gt;
 then have 6: &amp;quot;¬ P x1&amp;quot; by (rule notI)}&lt;br /&gt;
then have 7: &amp;quot;∀x. ¬ P x&amp;quot; by (rule allI)&lt;br /&gt;
have 8: &amp;quot;False&amp;quot; using 1 7 by (rule notE)}&lt;br /&gt;
then show &amp;quot;∃x. P x&amp;quot; by (rule ccontr)&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
       ∀x. ¬(P x) ⊢ ¬(∃x. P x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17a: &lt;br /&gt;
  assumes &amp;quot;∀x. ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∃x. P x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
then obtain a where &amp;quot;P a&amp;quot; by (rule exE)&lt;br /&gt;
have &amp;quot; ¬ (P a)&amp;quot; using assms by (rule allE)&lt;br /&gt;
show False using `¬(P a)` `P a` by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
       ∃x. P x ⊢ ¬(∀x. ¬(P x))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18a: &lt;br /&gt;
  assumes &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. ¬(P x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;∀x. ¬(P x)&amp;quot;&lt;br /&gt;
obtain a where &amp;quot;P a&amp;quot; using assms by (rule exE)&lt;br /&gt;
have &amp;quot;¬(P a)&amp;quot; using `∀x. ¬(P x)`  by (rule allE)&lt;br /&gt;
show False using `¬(P a)` `P a`by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
       P a ⟶ (∀x. Q x) ⊢ ∀x. P a ⟶ Q x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19a: &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof &lt;br /&gt;
fix b&lt;br /&gt;
show &amp;quot;P a ⟶ Q b&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;P a&amp;quot; &lt;br /&gt;
have &amp;quot;∀x. Q x&amp;quot; using assms `P a` by (rule mp)&lt;br /&gt;
thus &amp;quot;Q b&amp;quot; by (rule allE)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
       {∀x y z. R x y ∧ R y z ⟶ R x z, &lt;br /&gt;
        ∀x. ¬(R x x)}&lt;br /&gt;
       ⊢ ∀x y. R x y ⟶ ¬(R y x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20a: &lt;br /&gt;
  assumes &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. ¬(R x x)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;∀x y. R x y ⟶ ¬(R y x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof (rule allI)+&lt;br /&gt;
fix  a b &lt;br /&gt;
show &amp;quot;R a b ⟶ ¬(R b a )&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
assume 1:&amp;quot;R a b&amp;quot;&lt;br /&gt;
show&amp;quot;¬(R b a)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume 2:&amp;quot;R b a&amp;quot; &lt;br /&gt;
have 3:&amp;quot;R a b ∧ R b a&amp;quot; using 1 2..&lt;br /&gt;
have  &amp;quot;∀y z. R a y ∧ R y z ⟶ R a z&amp;quot; using assms(1)..&lt;br /&gt;
hence  &amp;quot;∀z. R a b ∧ R b z ⟶ R a z&amp;quot;..&lt;br /&gt;
hence 4:&amp;quot;R a b ∧ R b a ⟶ R a a&amp;quot;..&lt;br /&gt;
have 5:&amp;quot;R a a&amp;quot; using 4 3..&lt;br /&gt;
have 6:&amp;quot; ¬(R a a)&amp;quot; using assms(2)..&lt;br /&gt;
show False using 6 5..&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     {∀x. P x ∨ Q x, ∃x. ¬(Q x), ∀x. R x ⟶ ¬(P x)} ⊢ ∃x. ¬(R x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21a:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ∨ Q x&amp;quot; &lt;br /&gt;
          &amp;quot;∃x. ¬(Q x)&amp;quot; &lt;br /&gt;
          &amp;quot;∀x. R x ⟶ ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. ¬(R x)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
proof-&lt;br /&gt;
obtain a where &amp;quot;¬(Q a)&amp;quot; using assms(2) by (rule exE)&lt;br /&gt;
have &amp;quot;P a ∨ Q a&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
show &amp;quot;∃x. ¬(R x)&amp;quot; using `P a ∨ Q a`&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;P a&amp;quot;&lt;br /&gt;
hence 1:&amp;quot;¬¬(P a)&amp;quot; by (rule notnotI)&lt;br /&gt;
have 2:&amp;quot;R a ⟶ ¬(P a)&amp;quot; using assms(3) by (rule allE)&lt;br /&gt;
have &amp;quot;¬(R a)&amp;quot; using 2 1 by (rule mt)&lt;br /&gt;
thus &amp;quot;∃x. ¬(R x)&amp;quot; by (rule exI)&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;Q a&amp;quot;&lt;br /&gt;
have False using `¬(Q a)` `Q a` by (rule notE) &lt;br /&gt;
thus &amp;quot;∃x. ¬(R x)&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     {∀x. P x ⟶ Q x ∨ R x, ¬(∃x. P x ∧ R x)} ⊢ ∀x. P x ⟶ Q x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22a:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x ∨ R x&amp;quot; &lt;br /&gt;
          &amp;quot;¬(∃x. P x ∧ R x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
fix a &lt;br /&gt;
show &amp;quot;P a ⟶ Q a&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
assume 1:&amp;quot;P a&amp;quot;&lt;br /&gt;
have 2:&amp;quot;P a ⟶ Q a ∨ R a&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
have 3:&amp;quot;Q a ∨ R a&amp;quot; using  2 1 by (rule mp)&lt;br /&gt;
show &amp;quot;Q a&amp;quot; using 3 &lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;Q a&amp;quot;&lt;br /&gt;
next &lt;br /&gt;
assume 4:&amp;quot;R a&amp;quot;&lt;br /&gt;
have &amp;quot;P a ∧ R a&amp;quot; using 1 4 by (rule conjI)&lt;br /&gt;
hence 5:&amp;quot;∃x. P x ∧ R x&amp;quot; by (rule exI)&lt;br /&gt;
have False using assms(2) 5 by (rule notE)&lt;br /&gt;
thus &amp;quot;Q a&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     ∃x y. R x y ∨ R y x ⊢ ∃x y. R x y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23a:&lt;br /&gt;
  assumes &amp;quot;∃x y. R x y ∨ R y x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x y. R x y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof -&lt;br /&gt;
obtain a where &amp;quot;∃y. R a y ∨ R y a &amp;quot; using assms by (rule exE)&lt;br /&gt;
then obtain b where 1:&amp;quot;R a b ∨ R b a&amp;quot; by (rule exE)&lt;br /&gt;
show &amp;quot;∃x y. R x y&amp;quot; using 1&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;R a b&amp;quot;&lt;br /&gt;
hence &amp;quot;∃y. R a y&amp;quot; by (rule exI)&lt;br /&gt;
thus &amp;quot;∃x y. R x y&amp;quot; by (rule exI)&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;R b a&amp;quot;&lt;br /&gt;
hence &amp;quot;∃y. R b y&amp;quot; by (rule exI)&lt;br /&gt;
thus &amp;quot;∃x y. R x y&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
       (∃x. ∀y. P x y) ⟶ (∀y. ∃x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24a: &lt;br /&gt;
  &amp;quot;(∃x. ∀y. P x y) ⟶ (∀y. ∃x. P x y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;∃x. ∀y. P x y&amp;quot;&lt;br /&gt;
then obtain a where 1:&amp;quot;∀y. P a y&amp;quot; by (rule exE)&lt;br /&gt;
{fix b &lt;br /&gt;
have &amp;quot;P a b&amp;quot; using 1 by (rule allE)&lt;br /&gt;
hence &amp;quot;∃x. P x b&amp;quot; by (rule exI)}&lt;br /&gt;
thus &amp;quot;∀y. ∃x. P x y&amp;quot; by (rule allI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
       (∀x. P x ⟶ Q) ⟷ ((∃x. P x) ⟶ Q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_25a: &lt;br /&gt;
  &amp;quot;(∀x. P x ⟶ Q) ⟷ ((∃x. P x) ⟶ Q)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
assume 1:&amp;quot;∀x. P x ⟶ Q&amp;quot;&lt;br /&gt;
show &amp;quot;(∃x. P x) ⟶ Q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;∃x. P x&amp;quot; &lt;br /&gt;
then obtain a where 3:&amp;quot;P a&amp;quot; by (rule exE)&lt;br /&gt;
have 4:&amp;quot;P a ⟶ Q&amp;quot;using 1 by (rule allE)&lt;br /&gt;
show &amp;quot;Q&amp;quot; using 4 3 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
next &lt;br /&gt;
assume 5:&amp;quot;(∃x. P x) ⟶ Q&amp;quot;&lt;br /&gt;
show &amp;quot;∀x. P x ⟶ Q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
fix a&lt;br /&gt;
show &amp;quot;P a⟶Q&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;P a&amp;quot;&lt;br /&gt;
hence 6:&amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
show &amp;quot;Q&amp;quot; using 5 6 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
       ((∀x. P x) ∧ (∀x. Q x)) ⟷ (∀x. P x ∧ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_26a: &lt;br /&gt;
  &amp;quot;((∀x. P x) ∧ (∀x. Q x)) ⟷ (∀x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
  &amp;quot;((∀x. P x) ∧ (∀x. Q x)) ⟷ (∀x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 0: &amp;quot;(∀x. P x) ∧ (∀x. Q x)&amp;quot;&lt;br /&gt;
  have 1: &amp;quot;∀x. P x&amp;quot; using 0 by (rule conjunct1)&lt;br /&gt;
  have 2: &amp;quot;∀x. Q x&amp;quot; using 0 by (rule conjunct2)&lt;br /&gt;
  {fix a&lt;br /&gt;
    have 3: &amp;quot;P a&amp;quot; using 1 by (rule allE)&lt;br /&gt;
    have 4: &amp;quot;Q a&amp;quot; using 2 by (rule allE)&lt;br /&gt;
    have 5: &amp;quot;P a ∧ Q a&amp;quot; using 3 4 by (rule conjI)}&lt;br /&gt;
  thus &amp;quot;∀x. P x ∧ Q x&amp;quot; by (rule allI)&lt;br /&gt;
next&lt;br /&gt;
  assume 0: &amp;quot;∀x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  {fix a&lt;br /&gt;
    have 1: &amp;quot;P a ∧ Q a&amp;quot; using 0 by (rule allE)&lt;br /&gt;
    have 2: &amp;quot;P a&amp;quot; using 1 by (rule conjunct1)}&lt;br /&gt;
  hence 3: &amp;quot;∀x. P x&amp;quot; by (rule allI)&lt;br /&gt;
 {fix a&lt;br /&gt;
    have 4: &amp;quot;P a ∧ Q a&amp;quot; using 0 by (rule allE)&lt;br /&gt;
    have 5: &amp;quot;Q a&amp;quot; using 4 by (rule conjunct2)}&lt;br /&gt;
  hence 6: &amp;quot;∀x. Q x&amp;quot; by (rule allI)&lt;br /&gt;
show &amp;quot;(∀x. P x) ∧ (∀x. Q x)&amp;quot; using 3 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar o refutar&lt;br /&gt;
       ((∀x. P x) ∨ (∀x. Q x)) ⟷ (∀x. P x ∨ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27a: &lt;br /&gt;
  &amp;quot;((∀x. P x) ∨ (∀x. Q x)) ⟷ (∀x. P x ∨ Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume  &amp;quot;(∀x. P x) ∨ (∀x. Q x)&amp;quot;&lt;br /&gt;
    moreover&lt;br /&gt;
      {assume  &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
        {fix a&lt;br /&gt;
          have &amp;quot;P a&amp;quot; using `∀x. P x` by (rule allE)&lt;br /&gt;
          have  &amp;quot;P a ∨ Q a&amp;quot; using `P a` by (rule disjI1)}&lt;br /&gt;
        hence &amp;quot;∀x. P x ∨ Q x&amp;quot; by (rule allI)}&lt;br /&gt;
      moreover&lt;br /&gt;
        {assume  &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
          {fix a&lt;br /&gt;
            have &amp;quot;Q a&amp;quot; using `∀x. Q x` by (rule allE)&lt;br /&gt;
            have  &amp;quot;P a ∨ Q a&amp;quot; using `Q a` by (rule disjI2)}&lt;br /&gt;
        hence &amp;quot;∀x. P x ∨ Q x&amp;quot; by (rule allI)}&lt;br /&gt;
      ultimately show &amp;quot;∀x. P x ∨ Q x&amp;quot; by (rule disjE)&lt;br /&gt;
next&lt;br /&gt;
  assume  &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text{* &lt;br /&gt;
Consideremos los números naturales, ℕ. Sea P = &amp;quot;Ser par&amp;quot; y Q = &amp;quot;Ser impar&amp;quot;. Claramente &lt;br /&gt;
∀x, P x ∨ Q x, pero es falso  (∀x P x)∨(∀x Q x), pues no todo número es par&lt;br /&gt;
 y no todo número es impar. Por tanto la propiedad, en general, es falsa. Es decir, &lt;br /&gt;
((∀x. P x) ∨ (∀x. Q x)) ⟶ (∀x. P x ∨ Q x) pero en general&lt;br /&gt;
 (∀x. P x ∨ Q x) no implica ((∀x. P x) ∨ (∀x. Q x))&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar o refutar&lt;br /&gt;
       ((∃x. P x) ∨ (∃x. Q x)) ⟷ (∃x. P x ∨ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28a: &lt;br /&gt;
  &amp;quot;((∃x. P x) ∨ (∃x. Q x)) ⟷ (∃x. P x ∨ Q x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
assume 1:&amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot; &lt;br /&gt;
show &amp;quot;∃x. P x ∨ Q x&amp;quot; using 1&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;∃x. P x&amp;quot; &lt;br /&gt;
then obtain a where &amp;quot;P a&amp;quot; by (rule exE)&lt;br /&gt;
hence &amp;quot;P a ∨ Q a&amp;quot; by (rule disjI1)&lt;br /&gt;
thus &amp;quot;∃x. P x ∨ Q x&amp;quot; by (rule exI)&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;∃x. Q x&amp;quot; &lt;br /&gt;
then obtain a where &amp;quot;Q a&amp;quot; by (rule exE)&lt;br /&gt;
hence &amp;quot;P a ∨ Q a&amp;quot; by (rule disjI2)&lt;br /&gt;
thus &amp;quot;∃x. P x ∨ Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;∃x. P x ∨ Q x&amp;quot; &lt;br /&gt;
then obtain a where 2:&amp;quot;P a ∨ Q a&amp;quot; by (rule exE)&lt;br /&gt;
show &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot; using 2&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;P a&amp;quot; &lt;br /&gt;
hence &amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
thus &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot; by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;Q a&amp;quot;&lt;br /&gt;
hence &amp;quot;∃x. Q x&amp;quot; by (rule exI)&lt;br /&gt;
thus &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot; by (rule disjI2)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar o refutar&lt;br /&gt;
       (∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29: &lt;br /&gt;
&lt;br /&gt;
  &amp;quot;(∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
text{*&lt;br /&gt;
Propiedad en general falsa. Sean los números naturales, y la propiedad P x y = &amp;quot;x + y es par&amp;quot;. Claramente, para todo x, existe un y tal que P x y se verifica (baste tomar y = x). Pero, sea cual sea el y natural que tomemos, da igual el y que tomemos: no para todo elemento que le sumemos la suma será par. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar o refutar&lt;br /&gt;
       (¬(∀x. P x)) ⟷ (∃x. ¬P x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30a: &lt;br /&gt;
  &amp;quot;(¬(∀x. P x)) ⟷ (∃x. ¬P x)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
section {* Ejercicios sobre igualdad *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar o refutar&lt;br /&gt;
       P a ⟹ ∀x. x = a ⟶ P x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31a:&lt;br /&gt;
  assumes &amp;quot;P a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. x = a ⟶ P x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar o refutar&lt;br /&gt;
       ∃x y. R x y ∨ R y x; ¬(∃x. R x x)⟧ ⟹ ∃x y. x ≠ y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32a:&lt;br /&gt;
  fixes R :: &amp;quot;&amp;#039;c ⇒ &amp;#039;c ⇒ bool&amp;quot;&lt;br /&gt;
  assumes &amp;quot;∃x y. R x y ∨ R y x&amp;quot;&lt;br /&gt;
          &amp;quot;¬(∃x. R x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃(x::&amp;#039;c) y. x ≠ y&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)} &lt;br /&gt;
     ⊢ P (f a) a (f a)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33a:&lt;br /&gt;
  assumes &amp;quot;∀x. P a x x&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P (f a) a (f a)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)⟧&lt;br /&gt;
     ⊢ ∃z. P (f a) z (f (f a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34a:&lt;br /&gt;
  assumes &amp;quot;∀x. P a x x&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar o refutar&lt;br /&gt;
     {∀y. Q a y, &lt;br /&gt;
      ∀x y. Q x y ⟶ Q (s x) (s y)} &lt;br /&gt;
     ⊢ ∃z. Qa z ∧ Q z (s (s a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35a:&lt;br /&gt;
  assumes &amp;quot;∀y. Q a y&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar o refutar&lt;br /&gt;
     {x = f x, odd (f x)} ⊢ odd x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36a:&lt;br /&gt;
  assumes &amp;quot;x = f x&amp;quot; and&lt;br /&gt;
          &amp;quot;odd (f x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;odd x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar o refutar&lt;br /&gt;
     {x = f x, triple (f x) (f x) x} ⊢ triple x x x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37a:&lt;br /&gt;
  assumes &amp;quot;x = f x&amp;quot; and&lt;br /&gt;
          &amp;quot;triple (f x) (f x) x&amp;quot;&lt;br /&gt;
  shows &amp;quot;triple x x x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_4&amp;diff=222</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_4&amp;diff=222"/>
		<updated>2015-03-28T08:16:20Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang =&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R4: Deducción natural de primer orden *}&lt;br /&gt;
&lt;br /&gt;
theory R4&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores y de la igualdad: &lt;br /&gt;
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  · conjunct1:  P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:  P ∧ Q ⟹ Q  &lt;br /&gt;
  · notnotD:    ¬¬ P ⟹ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · impI:       (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · disjI1:     P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2:     Q ⟹ P ∨ Q&lt;br /&gt;
  · disjE:      ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
  · FalseE:     False ⟹ P&lt;br /&gt;
  · notE:       ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · notI:       (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · iffI:       ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  · iffD1:      ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2:      ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
  · ccontr:     (¬P ⟹ False) ⟹ P&lt;br /&gt;
  · excluded_middel:(¬P ∨ P) &lt;br /&gt;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀x. P x) ⟹ ∀x. P x&lt;br /&gt;
  · exI:        P x ⟹ ∃x. P x&lt;br /&gt;
  · exE:        ⟦∃x. P x; ⋀x. P x ⟹ Q⟧ ⟹ Q&lt;br /&gt;
&lt;br /&gt;
  · refl:       t = t&lt;br /&gt;
  · subst:      ⟦s = t; P s⟧ ⟹ P t&lt;br /&gt;
  · trans:      ⟦r = s; s = t⟧ ⟹ r = t&lt;br /&gt;
  · sym:        s = t ⟹ t = s&lt;br /&gt;
  · not_sym:    t ≠ s ⟹ s ≠ t&lt;br /&gt;
  · ssubst:     ⟦t = s; P s⟧ ⟹ P t&lt;br /&gt;
  · box_equals: ⟦a = b; a = c; b = d⟧ ⟹ a: = d&lt;br /&gt;
  · arg_cong:   x = y ⟹ f x = f y&lt;br /&gt;
  · fun_cong:   f = g ⟹ f x = g x&lt;br /&gt;
  · cong:       ⟦f = g; x = y⟧ ⟹ f x = g y&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI y mt que demostramos a continuación.&lt;br /&gt;
  *}&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       ∀x. P x ⟶ Q x ⊢ (∀x. P x) ⟶ (∀x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. P x) ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  { fix a&lt;br /&gt;
    have &amp;quot;P a ⟶ Q a&amp;quot; using assms by (rule allE)&lt;br /&gt;
    have &amp;quot;P a&amp;quot; using `∀x. P x` by (rule allE)&lt;br /&gt;
    have &amp;quot;Q a&amp;quot; using `P a ⟶ Q a` `P a` by (rule mp)}&lt;br /&gt;
thus &amp;quot;∀x. Q x&amp;quot; by (rule allI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-María Dolores Mateo&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
       ∃x. ¬(P x) ⊢ ¬(∀x. P x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2a: &lt;br /&gt;
  assumes &amp;quot;∃x. ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. P x)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;∀x. P x&amp;quot; &lt;br /&gt;
  obtain a where &amp;quot;¬ (P a)&amp;quot; using assms by (rule exE)&lt;br /&gt;
  have &amp;quot;P a&amp;quot; using `∀x. P x` by (rule allE)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using `¬ (P a)` `P a` by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-María Dolores Mateo&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
       ∀x. P x ⊢ ∀y. P y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀y. P y&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
{ fix a&lt;br /&gt;
  show &amp;quot;P a&amp;quot; using assms by (rule allE)}&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-María Dolores Mateo&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
       ∀x. P x ⟶ Q x ⊢ (∀x. ¬(Q x)) ⟶ (∀x. ¬ (P x))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. ¬(Q x)) ⟶ (∀x. ¬ (P x))&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;∀x. ¬(Q x)&amp;quot;&lt;br /&gt;
  { fix a&lt;br /&gt;
    have &amp;quot;P a ⟶ Q a&amp;quot; using assms by (rule allE)&lt;br /&gt;
    have &amp;quot;¬ (Q a)&amp;quot; using `∀x. ¬(Q x)` by (rule allE)&lt;br /&gt;
    have &amp;quot;¬(P a)&amp;quot; using `P a ⟶ Q a` `¬ (Q a)` by (rule mt)}&lt;br /&gt;
thus &amp;quot;∀x. ¬ (P x)&amp;quot; by (rule allI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-María Dolores Mateo&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
       ∀x. P x  ⟶ ¬(Q x) ⊢ ¬(∃x. P x ∧ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5: &lt;br /&gt;
  assumes &amp;quot;∀x. P x  ⟶ ¬(Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∃x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;∃x. P x ∧ Q x&amp;quot; &lt;br /&gt;
  obtain a where &amp;quot;P a ∧ Q a&amp;quot; using `∃x. P x ∧ Q x` by (rule exE)&lt;br /&gt;
  have &amp;quot;P a&amp;quot; using `P a ∧ Q a` by (rule conjE)&lt;br /&gt;
  have &amp;quot;Q a&amp;quot; using `P a ∧ Q a` by (rule conjE)&lt;br /&gt;
  have &amp;quot;P a  ⟶ ¬(Q a)&amp;quot; using assms by (rule allE)&lt;br /&gt;
  have &amp;quot;¬(Q a)&amp;quot; using `P a  ⟶ ¬(Q a)` `P a` by (rule mp)&lt;br /&gt;
show &amp;quot;False&amp;quot; using `¬(Q a)` `Q a` by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-María Dolores Mateo&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
       ∀x y. P x y ⊢ ∀u v. P u v&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6: &lt;br /&gt;
  assumes &amp;quot;∀x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀u v. P u v&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof (rule allI)+&lt;br /&gt;
fix a b &lt;br /&gt;
have  &amp;quot;∀y. P a y&amp;quot; using assms by (rule allE)&lt;br /&gt;
thus &amp;quot; P a b&amp;quot; by (rule allE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6b: &lt;br /&gt;
  assumes 1: &amp;quot;∀x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀u v. P u v&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
{fix u0 &lt;br /&gt;
 {fix v0&lt;br /&gt;
  have 2: &amp;quot;∀y. P u0 y&amp;quot; using 1  by (rule allE)&lt;br /&gt;
  have 3: &amp;quot;P u0 v0&amp;quot; using 2 by (rule allE)}&lt;br /&gt;
 then have 4: &amp;quot;∀v. P u0 v&amp;quot; by (rule allI)}&lt;br /&gt;
then show &amp;quot;∀u v. P u v&amp;quot; by (rule allI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
       ∃x y. P x y ⟹ ∃u v. P u v&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7: &lt;br /&gt;
  assumes &amp;quot;∃x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃u v. P u v&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof -&lt;br /&gt;
obtain a where &amp;quot;∃y. P a y&amp;quot; using assms by (rule exE)&lt;br /&gt;
then obtain b where &amp;quot;P a b&amp;quot; by (rule exE)&lt;br /&gt;
hence &amp;quot;∃v. P a v&amp;quot; by (rule exI)&lt;br /&gt;
thus &amp;quot;∃u v. P u v&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
       ∃x. ∀y. P x y ⊢ ∀y. ∃x. P x y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8: &lt;br /&gt;
  assumes &amp;quot;∃x. ∀y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀y. ∃x. P x y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof &lt;br /&gt;
obtain a where &amp;quot;∀y. P a y&amp;quot; using assms by (rule exE)&lt;br /&gt;
fix b &lt;br /&gt;
have &amp;quot;P a b&amp;quot; using `∀y. P a y` by (rule allE)&lt;br /&gt;
thus &amp;quot;∃x. P x b&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
       ∃x. P a ⟶ Q x ⊢ P a ⟶ (∃x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9: &lt;br /&gt;
  assumes &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;P a&amp;quot;&lt;br /&gt;
obtain b where &amp;quot;P a ⟶ Q b&amp;quot; using assms by (rule exE)&lt;br /&gt;
have &amp;quot;Q b&amp;quot; using `P a ⟶ Q b` `P a` by (rule mp)&lt;br /&gt;
thus &amp;quot;∃x. Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
       P a ⟶ (∃x. Q x) ⊢ ∃x. P a ⟶ Q x &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10a: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
       (∃x. P x) ⟶ Q a ⊢ ∀x. P x ⟶ Q a&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11a: &lt;br /&gt;
  assumes &amp;quot;(∃x. P x) ⟶ Q a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof &lt;br /&gt;
fix b&lt;br /&gt;
show &amp;quot;P b ⟶ Q a&amp;quot;  &lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;P b&amp;quot;&lt;br /&gt;
hence &amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
show &amp;quot;Q a&amp;quot; using assms `∃x. P x` by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
       ∀x. P x ⟶ Q a ⊢ ∃ x. P x ⟶ Q a&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof -&lt;br /&gt;
fix b&lt;br /&gt;
have &amp;quot;P b ⟶ Q a&amp;quot; using assms by (rule allE)&lt;br /&gt;
thus &amp;quot;∃x. P x ⟶ Q a&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
       (∀x. P x) ∨ (∀x. Q x) ⊢ ∀x. P x ∨ Q x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13a: &lt;br /&gt;
  assumes &amp;quot;(∀x. P x) ∨ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof &lt;br /&gt;
fix a&lt;br /&gt;
show &amp;quot;P a ∨ Q a&amp;quot; using assms&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
hence &amp;quot;P a&amp;quot; by (rule allE)&lt;br /&gt;
thus &amp;quot;P a ∨ Q a&amp;quot; by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
hence &amp;quot;Q a&amp;quot; by (rule allE)&lt;br /&gt;
thus &amp;quot;P a ∨ Q a&amp;quot; by (rule disjI2)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
       ∃x. P x ∧ Q x ⊢ (∃x. P x) ∧ (∃x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14a: &lt;br /&gt;
  assumes &amp;quot;∃x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. P x) ∧ (∃x. Q x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
obtain a where &amp;quot;P a ∧ Q a&amp;quot; using assms by (rule exE)&lt;br /&gt;
hence &amp;quot;P a&amp;quot; by (rule conjunct1)&lt;br /&gt;
thus &amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
have &amp;quot;Q a&amp;quot; using  `P a ∧ Q a` by (rule conjunct2)&lt;br /&gt;
thus &amp;quot;∃x. Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
       ∀x y. P y ⟶ Q x ⊢ (∃y. P y) ⟶ (∀x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15a: &lt;br /&gt;
  assumes &amp;quot;∀x y. P y ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃y. P y) ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;∃y. P y&amp;quot;&lt;br /&gt;
then obtain b where &amp;quot;P b&amp;quot; by (rule exE)&lt;br /&gt;
{fix a &lt;br /&gt;
have &amp;quot;∀y. P y ⟶ Q a&amp;quot; using assms by (rule allE)&lt;br /&gt;
hence &amp;quot;P b ⟶ Q a&amp;quot; by (rule allE)&lt;br /&gt;
have &amp;quot;Q a&amp;quot; using `P b ⟶ Q a` `P b` by (rule mp)}&lt;br /&gt;
thus &amp;quot;∀x. Q x&amp;quot; by (rule allI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
       ¬(∀x. ¬(P x)) ⊢ ∃x. P x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16a: &lt;br /&gt;
  assumes &amp;quot;¬(∀x. ¬(P x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
       ∀x. ¬(P x) ⊢ ¬(∃x. P x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17a: &lt;br /&gt;
  assumes &amp;quot;∀x. ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∃x. P x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
then obtain a where &amp;quot;P a&amp;quot; by (rule exE)&lt;br /&gt;
have &amp;quot; ¬ (P a)&amp;quot; using assms by (rule allE)&lt;br /&gt;
show False using `¬(P a)` `P a` by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
       ∃x. P x ⊢ ¬(∀x. ¬(P x))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18a: &lt;br /&gt;
  assumes &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. ¬(P x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;∀x. ¬(P x)&amp;quot;&lt;br /&gt;
obtain a where &amp;quot;P a&amp;quot; using assms by (rule exE)&lt;br /&gt;
have &amp;quot;¬(P a)&amp;quot; using `∀x. ¬(P x)`  by (rule allE)&lt;br /&gt;
show False using `¬(P a)` `P a`by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
       P a ⟶ (∀x. Q x) ⊢ ∀x. P a ⟶ Q x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19a: &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof &lt;br /&gt;
fix b&lt;br /&gt;
show &amp;quot;P a ⟶ Q b&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;P a&amp;quot; &lt;br /&gt;
have &amp;quot;∀x. Q x&amp;quot; using assms `P a` by (rule mp)&lt;br /&gt;
thus &amp;quot;Q b&amp;quot; by (rule allE)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
       {∀x y z. R x y ∧ R y z ⟶ R x z, &lt;br /&gt;
        ∀x. ¬(R x x)}&lt;br /&gt;
       ⊢ ∀x y. R x y ⟶ ¬(R y x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20a: &lt;br /&gt;
  assumes &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. ¬(R x x)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;∀x y. R x y ⟶ ¬(R y x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof (rule allI)+&lt;br /&gt;
fix  a b &lt;br /&gt;
show &amp;quot;R a b ⟶ ¬(R b a )&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
assume 1:&amp;quot;R a b&amp;quot;&lt;br /&gt;
show&amp;quot;¬(R b a)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume 2:&amp;quot;R b a&amp;quot; &lt;br /&gt;
have 3:&amp;quot;R a b ∧ R b a&amp;quot; using 1 2..&lt;br /&gt;
have  &amp;quot;∀y z. R a y ∧ R y z ⟶ R a z&amp;quot; using assms(1)..&lt;br /&gt;
hence  &amp;quot;∀z. R a b ∧ R b z ⟶ R a z&amp;quot;..&lt;br /&gt;
hence 4:&amp;quot;R a b ∧ R b a ⟶ R a a&amp;quot;..&lt;br /&gt;
have 5:&amp;quot;R a a&amp;quot; using 4 3..&lt;br /&gt;
have 6:&amp;quot; ¬(R a a)&amp;quot; using assms(2)..&lt;br /&gt;
show False using 6 5..&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     {∀x. P x ∨ Q x, ∃x. ¬(Q x), ∀x. R x ⟶ ¬(P x)} ⊢ ∃x. ¬(R x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21a:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ∨ Q x&amp;quot; &lt;br /&gt;
          &amp;quot;∃x. ¬(Q x)&amp;quot; &lt;br /&gt;
          &amp;quot;∀x. R x ⟶ ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. ¬(R x)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
proof-&lt;br /&gt;
obtain a where &amp;quot;¬(Q a)&amp;quot; using assms(2) by (rule exE)&lt;br /&gt;
have &amp;quot;P a ∨ Q a&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
show &amp;quot;∃x. ¬(R x)&amp;quot; using `P a ∨ Q a`&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;P a&amp;quot;&lt;br /&gt;
hence 1:&amp;quot;¬¬(P a)&amp;quot; by (rule notnotI)&lt;br /&gt;
have 2:&amp;quot;R a ⟶ ¬(P a)&amp;quot; using assms(3) by (rule allE)&lt;br /&gt;
have &amp;quot;¬(R a)&amp;quot; using 2 1 by (rule mt)&lt;br /&gt;
thus &amp;quot;∃x. ¬(R x)&amp;quot; by (rule exI)&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;Q a&amp;quot;&lt;br /&gt;
have False using `¬(Q a)` `Q a` by (rule notE) &lt;br /&gt;
thus &amp;quot;∃x. ¬(R x)&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     {∀x. P x ⟶ Q x ∨ R x, ¬(∃x. P x ∧ R x)} ⊢ ∀x. P x ⟶ Q x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22a:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x ∨ R x&amp;quot; &lt;br /&gt;
          &amp;quot;¬(∃x. P x ∧ R x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
fix a &lt;br /&gt;
show &amp;quot;P a ⟶ Q a&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
assume 1:&amp;quot;P a&amp;quot;&lt;br /&gt;
have 2:&amp;quot;P a ⟶ Q a ∨ R a&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
have 3:&amp;quot;Q a ∨ R a&amp;quot; using  2 1 by (rule mp)&lt;br /&gt;
show &amp;quot;Q a&amp;quot; using 3 &lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;Q a&amp;quot;&lt;br /&gt;
next &lt;br /&gt;
assume 4:&amp;quot;R a&amp;quot;&lt;br /&gt;
have &amp;quot;P a ∧ R a&amp;quot; using 1 4 by (rule conjI)&lt;br /&gt;
hence 5:&amp;quot;∃x. P x ∧ R x&amp;quot; by (rule exI)&lt;br /&gt;
have False using assms(2) 5 by (rule notE)&lt;br /&gt;
thus &amp;quot;Q a&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     ∃x y. R x y ∨ R y x ⊢ ∃x y. R x y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23a:&lt;br /&gt;
  assumes &amp;quot;∃x y. R x y ∨ R y x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x y. R x y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof -&lt;br /&gt;
obtain a where &amp;quot;∃y. R a y ∨ R y a &amp;quot; using assms by (rule exE)&lt;br /&gt;
then obtain b where 1:&amp;quot;R a b ∨ R b a&amp;quot; by (rule exE)&lt;br /&gt;
show &amp;quot;∃x y. R x y&amp;quot; using 1&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;R a b&amp;quot;&lt;br /&gt;
hence &amp;quot;∃y. R a y&amp;quot; by (rule exI)&lt;br /&gt;
thus &amp;quot;∃x y. R x y&amp;quot; by (rule exI)&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;R b a&amp;quot;&lt;br /&gt;
hence &amp;quot;∃y. R b y&amp;quot; by (rule exI)&lt;br /&gt;
thus &amp;quot;∃x y. R x y&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
       (∃x. ∀y. P x y) ⟶ (∀y. ∃x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24a: &lt;br /&gt;
  &amp;quot;(∃x. ∀y. P x y) ⟶ (∀y. ∃x. P x y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;∃x. ∀y. P x y&amp;quot;&lt;br /&gt;
then obtain a where 1:&amp;quot;∀y. P a y&amp;quot; by (rule exE)&lt;br /&gt;
{fix b &lt;br /&gt;
have &amp;quot;P a b&amp;quot; using 1 by (rule allE)&lt;br /&gt;
hence &amp;quot;∃x. P x b&amp;quot; by (rule exI)}&lt;br /&gt;
thus &amp;quot;∀y. ∃x. P x y&amp;quot; by (rule allI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
       (∀x. P x ⟶ Q) ⟷ ((∃x. P x) ⟶ Q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_25a: &lt;br /&gt;
  &amp;quot;(∀x. P x ⟶ Q) ⟷ ((∃x. P x) ⟶ Q)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
assume 1:&amp;quot;∀x. P x ⟶ Q&amp;quot;&lt;br /&gt;
show &amp;quot;(∃x. P x) ⟶ Q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;∃x. P x&amp;quot; &lt;br /&gt;
then obtain a where 3:&amp;quot;P a&amp;quot; by (rule exE)&lt;br /&gt;
have 4:&amp;quot;P a ⟶ Q&amp;quot;using 1 by (rule allE)&lt;br /&gt;
show &amp;quot;Q&amp;quot; using 4 3 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
next &lt;br /&gt;
assume 5:&amp;quot;(∃x. P x) ⟶ Q&amp;quot;&lt;br /&gt;
show &amp;quot;∀x. P x ⟶ Q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
fix a&lt;br /&gt;
show &amp;quot;P a⟶Q&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;P a&amp;quot;&lt;br /&gt;
hence 6:&amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
show &amp;quot;Q&amp;quot; using 5 6 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--Jaime Alberto&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
       ((∀x. P x) ∧ (∀x. Q x)) ⟷ (∀x. P x ∧ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_26a: &lt;br /&gt;
  &amp;quot;((∀x. P x) ∧ (∀x. Q x)) ⟷ (∀x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
  &amp;quot;((∀x. P x) ∧ (∀x. Q x)) ⟷ (∀x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 0: &amp;quot;(∀x. P x) ∧ (∀x. Q x)&amp;quot;&lt;br /&gt;
  have 1: &amp;quot;∀x. P x&amp;quot; using 0 by (rule conjunct1)&lt;br /&gt;
  have 2: &amp;quot;∀x. Q x&amp;quot; using 0 by (rule conjunct2)&lt;br /&gt;
  {fix a&lt;br /&gt;
    have 3: &amp;quot;P a&amp;quot; using 1 by (rule allE)&lt;br /&gt;
    have 4: &amp;quot;Q a&amp;quot; using 2 by (rule allE)&lt;br /&gt;
    have 5: &amp;quot;P a ∧ Q a&amp;quot; using 3 4 by (rule conjI)}&lt;br /&gt;
  thus &amp;quot;∀x. P x ∧ Q x&amp;quot; by (rule allI)&lt;br /&gt;
next&lt;br /&gt;
  assume 0: &amp;quot;∀x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  {fix a&lt;br /&gt;
    have 1: &amp;quot;P a ∧ Q a&amp;quot; using 0 by (rule allE)&lt;br /&gt;
    have 2: &amp;quot;P a&amp;quot; using 1 by (rule conjunct1)}&lt;br /&gt;
  hence 3: &amp;quot;∀x. P x&amp;quot; by (rule allI)&lt;br /&gt;
 {fix a&lt;br /&gt;
    have 4: &amp;quot;P a ∧ Q a&amp;quot; using 0 by (rule allE)&lt;br /&gt;
    have 5: &amp;quot;Q a&amp;quot; using 4 by (rule conjunct2)}&lt;br /&gt;
  hence 6: &amp;quot;∀x. Q x&amp;quot; by (rule allI)&lt;br /&gt;
show &amp;quot;(∀x. P x) ∧ (∀x. Q x)&amp;quot; using 3 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar o refutar&lt;br /&gt;
       ((∀x. P x) ∨ (∀x. Q x)) ⟷ (∀x. P x ∨ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27a: &lt;br /&gt;
  &amp;quot;((∀x. P x) ∨ (∀x. Q x)) ⟷ (∀x. P x ∨ Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume  &amp;quot;(∀x. P x) ∨ (∀x. Q x)&amp;quot;&lt;br /&gt;
    moreover&lt;br /&gt;
      {assume  &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
        {fix a&lt;br /&gt;
          have &amp;quot;P a&amp;quot; using `∀x. P x` by (rule allE)&lt;br /&gt;
          have  &amp;quot;P a ∨ Q a&amp;quot; using `P a` by (rule disjI1)}&lt;br /&gt;
        hence &amp;quot;∀x. P x ∨ Q x&amp;quot; by (rule allI)}&lt;br /&gt;
      moreover&lt;br /&gt;
        {assume  &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
          {fix a&lt;br /&gt;
            have &amp;quot;Q a&amp;quot; using `∀x. Q x` by (rule allE)&lt;br /&gt;
            have  &amp;quot;P a ∨ Q a&amp;quot; using `Q a` by (rule disjI2)}&lt;br /&gt;
        hence &amp;quot;∀x. P x ∨ Q x&amp;quot; by (rule allI)}&lt;br /&gt;
      ultimately show &amp;quot;∀x. P x ∨ Q x&amp;quot; by (rule disjE)&lt;br /&gt;
next&lt;br /&gt;
  assume  &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text{* &lt;br /&gt;
Consideremos los números naturales, ℕ. Sea P = &amp;quot;Ser par&amp;quot; y Q = &amp;quot;Ser impar&amp;quot;. Claramente &lt;br /&gt;
∀x, P x ∨ Q x, pero es falso  (∀x P x)∨(∀x Q x), pues no todo número es par&lt;br /&gt;
 y no todo número es impar. Por tanto la propiedad, en general, es falsa. Es decir, &lt;br /&gt;
((∀x. P x) ∨ (∀x. Q x)) ⟶ (∀x. P x ∨ Q x) pero en general&lt;br /&gt;
 (∀x. P x ∨ Q x) no implica ((∀x. P x) ∨ (∀x. Q x))&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar o refutar&lt;br /&gt;
       ((∃x. P x) ∨ (∃x. Q x)) ⟷ (∃x. P x ∨ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28a: &lt;br /&gt;
  &amp;quot;((∃x. P x) ∨ (∃x. Q x)) ⟷ (∃x. P x ∨ Q x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
proof&lt;br /&gt;
assume 1:&amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot; &lt;br /&gt;
show &amp;quot;∃x. P x ∨ Q x&amp;quot; using 1&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;∃x. P x&amp;quot; &lt;br /&gt;
then obtain a where &amp;quot;P a&amp;quot; by (rule exE)&lt;br /&gt;
hence &amp;quot;P a ∨ Q a&amp;quot; by (rule disjI1)&lt;br /&gt;
thus &amp;quot;∃x. P x ∨ Q x&amp;quot; by (rule exI)&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;∃x. Q x&amp;quot; &lt;br /&gt;
then obtain a where &amp;quot;Q a&amp;quot; by (rule exE)&lt;br /&gt;
hence &amp;quot;P a ∨ Q a&amp;quot; by (rule disjI2)&lt;br /&gt;
thus &amp;quot;∃x. P x ∨ Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;∃x. P x ∨ Q x&amp;quot; &lt;br /&gt;
then obtain a where 2:&amp;quot;P a ∨ Q a&amp;quot; by (rule exE)&lt;br /&gt;
show &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot; using 2&lt;br /&gt;
proof&lt;br /&gt;
assume &amp;quot;P a&amp;quot; &lt;br /&gt;
hence &amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
thus &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot; by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;Q a&amp;quot;&lt;br /&gt;
hence &amp;quot;∃x. Q x&amp;quot; by (rule exI)&lt;br /&gt;
thus &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot; by (rule disjI2)&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar o refutar&lt;br /&gt;
       (∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29: &lt;br /&gt;
&lt;br /&gt;
  &amp;quot;(∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
text{*&lt;br /&gt;
Propiedad en general falsa. Sean los números naturales, y la propiedad P x y = &amp;quot;x + y es par&amp;quot;. Claramente, para todo x, existe un y tal que P x y se verifica (baste tomar y = x). Pero, sea cual sea el y natural que tomemos, da igual el y que tomemos: no para todo elemento que le sumemos la suma será par. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar o refutar&lt;br /&gt;
       (¬(∀x. P x)) ⟷ (∃x. ¬P x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30a: &lt;br /&gt;
  &amp;quot;(¬(∀x. P x)) ⟷ (∃x. ¬P x)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
section {* Ejercicios sobre igualdad *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar o refutar&lt;br /&gt;
       P a ⟹ ∀x. x = a ⟶ P x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31a:&lt;br /&gt;
  assumes &amp;quot;P a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. x = a ⟶ P x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar o refutar&lt;br /&gt;
       ∃x y. R x y ∨ R y x; ¬(∃x. R x x)⟧ ⟹ ∃x y. x ≠ y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32a:&lt;br /&gt;
  fixes R :: &amp;quot;&amp;#039;c ⇒ &amp;#039;c ⇒ bool&amp;quot;&lt;br /&gt;
  assumes &amp;quot;∃x y. R x y ∨ R y x&amp;quot;&lt;br /&gt;
          &amp;quot;¬(∃x. R x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃(x::&amp;#039;c) y. x ≠ y&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)} &lt;br /&gt;
     ⊢ P (f a) a (f a)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33a:&lt;br /&gt;
  assumes &amp;quot;∀x. P a x x&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P (f a) a (f a)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)⟧&lt;br /&gt;
     ⊢ ∃z. P (f a) z (f (f a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34a:&lt;br /&gt;
  assumes &amp;quot;∀x. P a x x&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar o refutar&lt;br /&gt;
     {∀y. Q a y, &lt;br /&gt;
      ∀x y. Q x y ⟶ Q (s x) (s y)} &lt;br /&gt;
     ⊢ ∃z. Qa z ∧ Q z (s (s a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35a:&lt;br /&gt;
  assumes &amp;quot;∀y. Q a y&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar o refutar&lt;br /&gt;
     {x = f x, odd (f x)} ⊢ odd x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36a:&lt;br /&gt;
  assumes &amp;quot;x = f x&amp;quot; and&lt;br /&gt;
          &amp;quot;odd (f x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;odd x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar o refutar&lt;br /&gt;
     {x = f x, triple (f x) (f x) x} ⊢ triple x x x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37a:&lt;br /&gt;
  assumes &amp;quot;x = f x&amp;quot; and&lt;br /&gt;
          &amp;quot;triple (f x) (f x) x&amp;quot;&lt;br /&gt;
  shows &amp;quot;triple x x x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=55</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=55"/>
		<updated>2015-02-10T12:32:35Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
perfectos x = [y|y&amp;lt;-[1..x-1], serPerfecto y]&lt;br /&gt;
serPerfecto x = x==sum (factores&amp;#039; x)&lt;br /&gt;
factores x = [y|y&amp;lt;-[1..x], rem x y == 0]&lt;br /&gt;
factores&amp;#039; x = init (factores x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
factoriales1 = [fact x|x&amp;lt;-[0..]]&lt;br /&gt;
fact 0 = 1&lt;br /&gt;
fact x = x*fact (x-1)&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
prop_espejo x = espejo (espejo x)==x&lt;br /&gt;
quickCheck prop_espejo&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=54</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=54"/>
		<updated>2015-02-10T12:29:26Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
perfectos x = [y|y&amp;lt;-[1..x-1], serPerfecto y]&lt;br /&gt;
serPerfecto x = x==sum (factores&amp;#039; x)&lt;br /&gt;
factores x = [y|y&amp;lt;-[1..x], rem x y == 0]&lt;br /&gt;
factores&amp;#039; x = init (factores x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
factoriales1 = [fact x|x&amp;lt;-[0..]]&lt;br /&gt;
fact 0 = 1&lt;br /&gt;
fact x = x*fact (x-1)&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
prop_espejo x = espejo (espejo x)==x&lt;br /&gt;
quickCheck prop_espejo&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=53</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=53"/>
		<updated>2015-02-10T12:22:01Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
perfectos x = [y|y&amp;lt;-[1..x-1], serPerfecto y]&lt;br /&gt;
serPerfecto x = x==sum (factores&amp;#039; x)&lt;br /&gt;
factores x = [y|y&amp;lt;-[1..x], rem x y == 0]&lt;br /&gt;
factores&amp;#039; x = init (factores x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
factoriales1 = [fact x|x&amp;lt;-[0..]]&lt;br /&gt;
fact 0 = 1&lt;br /&gt;
fact x = x*fact (x-1)&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
prop_espejo x = espejo (espejo x)==x&lt;br /&gt;
quickCheck prop_espejo&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=52</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=52"/>
		<updated>2015-02-10T12:16:48Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
perfectos x = [y|y&amp;lt;-[1..x-1], serPerfecto y]&lt;br /&gt;
serPerfecto x = x==sum (factores&amp;#039; x)&lt;br /&gt;
factores x = [y|y&amp;lt;-[1..x], rem x y == 0]&lt;br /&gt;
factores&amp;#039; x = init (factores x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
factoriales1 = [fact x|x&amp;lt;-[0..]]&lt;br /&gt;
fact 0 = 1&lt;br /&gt;
fact x = x*fact (x-1)&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=51</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=51"/>
		<updated>2015-02-10T11:54:00Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
perfectos x = [y|y&amp;lt;-[1..x-1], serPerfecto y]&lt;br /&gt;
serPerfecto x = x==sum (factores&amp;#039; x)&lt;br /&gt;
factores x = [y|y&amp;lt;-[1..x], rem x y == 0]&lt;br /&gt;
factores&amp;#039; x = init (factores x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
factoriales1 = [fact x|x&amp;lt;-[0..]]&lt;br /&gt;
fact 0 = 1&lt;br /&gt;
fact x = x*fact (x-1)&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=50</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=50"/>
		<updated>2015-02-10T11:43:46Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
perfectos x = [y|y&amp;lt;-[1..x-1], serPerfecto y]&lt;br /&gt;
serPerfecto x = x==sum (factores&amp;#039; x)&lt;br /&gt;
factores x = [y|y&amp;lt;-[1..x], rem x y == 0]&lt;br /&gt;
factores&amp;#039; x = init (factores x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=49</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=49"/>
		<updated>2015-02-10T11:39:44Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
perfectos x = [y|y&amp;lt;-[1..x-1], serPerfecto y]&lt;br /&gt;
serPerfecto x = x==sum (factores&amp;#039; x)&lt;br /&gt;
factores x = [y|y&amp;lt;-[1..x], rem x y == 0]&lt;br /&gt;
factores&amp;#039; x = init (factores x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=48</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=48"/>
		<updated>2015-02-10T11:35:39Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
perfectos x = [y|y&amp;lt;-[1..x-1], serPerfecto y]&lt;br /&gt;
serPerfecto x = x==sum (factores&amp;#039; x)&lt;br /&gt;
factores x = [y|y&amp;lt;-[1..x], rem x y == 0]&lt;br /&gt;
factores&amp;#039; x = init (factores x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=47</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=47"/>
		<updated>2015-02-10T11:32:08Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
perfectos x = [y|y&amp;lt;-[1..x-1], serPerfecto y]&lt;br /&gt;
serPerfecto x = x==sum (factores&amp;#039; x)&lt;br /&gt;
factores x = [y|y&amp;lt;-[1..x], rem x y == 0]&lt;br /&gt;
factores&amp;#039; x = init (factores x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=46</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=46"/>
		<updated>2015-02-10T11:29:47Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
perfectos x = [y|y&amp;lt;-[1..x-1], serPerfecto y]&lt;br /&gt;
serPerfecto x = x==sum (factores&amp;#039; x)&lt;br /&gt;
factores x = [y|y&amp;lt;-[1..x], rem x y == 0]&lt;br /&gt;
factores&amp;#039; x = init (factores x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=45</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=45"/>
		<updated>2015-02-10T11:28:01Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
perfectos x = [y|y&amp;lt;-[1..x-1], serPerfecto y]&lt;br /&gt;
serPerfecto x = x==sum (factores&amp;#039; x)&lt;br /&gt;
factores x = [y|y&amp;lt;-[1..x], rem x y == 0]&lt;br /&gt;
factores&amp;#039; x = init (factores x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&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;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=44</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=44"/>
		<updated>2015-02-10T11:23:35Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
perfectos x = [y|y&amp;lt;-[1..x-1], serPerfecto y]&lt;br /&gt;
serPerfecto x = x==sum (factores&amp;#039; x)&lt;br /&gt;
factores x = [y|y&amp;lt;-[1..x], rem x y == 0]&lt;br /&gt;
factores&amp;#039; x = init (factores x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&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;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=43</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=43"/>
		<updated>2015-02-10T11:17:08Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&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;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=42</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=42"/>
		<updated>2015-02-10T11:12:06Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&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;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=41</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=41"/>
		<updated>2015-02-10T11:10:02Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&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;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=40</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=40"/>
		<updated>2015-02-10T11:02:50Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
xor_2&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2&amp;#039;&amp;#039; x y |  x== True &amp;amp;&amp;amp; y== True || x==False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
          |  x== True &amp;amp;&amp;amp; y== False || x== False &amp;amp;&amp;amp; y== True = True  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&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;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=38</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=38"/>
		<updated>2015-02-10T10:58:57Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
-- Jaime Alberto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 x y   |x== True &amp;amp;&amp;amp; y== True = False &lt;br /&gt;
            |x== True &amp;amp;&amp;amp; y== False = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== True = True&lt;br /&gt;
            |x== False &amp;amp;&amp;amp; y== False = False&lt;br /&gt;
-- Jaime Alberto &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&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;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=36</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=36"/>
		<updated>2015-02-10T10:42:19Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&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;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=35</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=35"/>
		<updated>2015-02-10T10:26:02Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&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;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=34</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=34"/>
		<updated>2015-02-10T10:23:06Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&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;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=33</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2015/index.php?title=Relaci%C3%B3n_1&amp;diff=33"/>
		<updated>2015-02-10T10:20:35Z</updated>

		<summary type="html">&lt;p&gt;Rocrodhue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- LMF 2014-15: Rel_1.hs (9 de Febrero de 2015)&lt;br /&gt;
-- Introducción a la programación con Haskell.&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 de ejercicios hacemos una introducción a Haskell, en&lt;br /&gt;
-- la que se recuerdan:&lt;br /&gt;
-- * las definiciones elementales de funciones,&lt;br /&gt;
-- * las definiciones de funciones por comprensión,&lt;br /&gt;
-- * las definiciones de funciones por recursión y&lt;br /&gt;
-- * los tipos de datos.&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;
import Data.Char&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
-- Rocio Rodriguez &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
Miriam R.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
rota n xs= (drop n xs) ++ (take n xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función xor_1 que calcule la disyunción excluyente a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_1 True True = False&lt;br /&gt;
xor_1 True False = True&lt;br /&gt;
xor_1 False True = True&lt;br /&gt;
xor_1 False False = False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Definir la función xor_2 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la tabla de verdad y patrones. Usar 2&lt;br /&gt;
-- ecuaciones, una por cada valor del primer argumento.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_2 True x = if x then False else True&lt;br /&gt;
xor_2 False x = if x then True else False&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
xor_2&amp;#039; True x = not x&lt;br /&gt;
xor_2&amp;#039; False x = x&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Definir la función xor_3 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación&lt;br /&gt;
-- (not). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_3 x y = (x &amp;amp;&amp;amp; (not y)) || ((not x) &amp;amp;&amp;amp; y)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Definir la función xor_4 que calcule la disyunción&lt;br /&gt;
-- excluyente a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor_4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor_4 x y = x /= y&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir, por comprensión, la función&lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeCuadrados n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una terna (x,y,z) de enteros positivos es pitagórica si &lt;br /&gt;
-- x^2 + y^2 = z^2. Usando una lista por comprensión, definir la función&lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    *Main&amp;gt; pitagoricas 10 &lt;br /&gt;
--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int, Int, Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;- [1..n], y &amp;lt;- [1..n], z &amp;lt;- [1..n], x^2+y^2 == z^2]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. Usando una lista por&lt;br /&gt;
-- comprensión y la función factores (del tema), definir la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo: &lt;br /&gt;
--    *Main&amp;gt; perfectos 500&lt;br /&gt;
--    [6,28,496]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x &amp;lt;- [1..n], esPerfecto x]&lt;br /&gt;
&lt;br /&gt;
Definimos las funciones auxiliares:&lt;br /&gt;
&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n], n `mod` x == 0]&lt;br /&gt;
&lt;br /&gt;
esPerfecto :: Int -&amp;gt; Bool&lt;br /&gt;
esPerfecto n = sum (factores n) == 2*n&lt;br /&gt;
&lt;br /&gt;
También podríamos definirla como:&lt;br /&gt;
&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = filter (esPerfecto) [1..n]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que ambas definiciones son equivalentes:&lt;br /&gt;
&lt;br /&gt;
prop_perfectos n = perfectos n == perfectos2 n&lt;br /&gt;
&lt;br /&gt;
Si queremos podemos comparar ambos algoritmos:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(1.44 secs, 15935120 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; perfectos2 500&lt;br /&gt;
[6,28,496]&lt;br /&gt;
(0.22 secs, 14803544 bytes)&lt;br /&gt;
&lt;br /&gt;
Es decir, el segundo es más eficiente.&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por comprensión, la función&lt;br /&gt;
--    cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosC [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosC xs = [x^2 | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, por recursión, la función&lt;br /&gt;
--    cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cuadradosR [1,2,3]  ==  [1,4,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cuadradosR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
cuadradosR [] = []&lt;br /&gt;
cuadradosR (x:xs) = (x^2):(cuadradosR xs)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&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;
--    imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesC xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesC [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesC :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesC xs = [x | x &amp;lt;- xs, odd x]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por recursión, la función&lt;br /&gt;
--    imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (imparesR xs) es la lista de los números impares de xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    imparesR [1,2,3]  ==  [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
imparesR :: [Integer] -&amp;gt; [Integer]&lt;br /&gt;
imparesR [] = []&lt;br /&gt;
imparesR (x:xs) | odd x = x:(imparesR xs)&lt;br /&gt;
                | otherwise = imparesR xs&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [x+y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.  La distancia de Hamming entre dos listas es el número&lt;br /&gt;
-- de posiciones en que los correspondientes elementos son&lt;br /&gt;
-- distintos. Por ejemplo, la distancia de Hamming entre &amp;quot;roma&amp;quot; y &amp;quot;loba&amp;quot; &lt;br /&gt;
-- es 2 (porque hay 2 posiciones en las que los elementos&lt;br /&gt;
-- correspondientes son distintos: la 1ª y la 3ª). &lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función distancia tal que (distancia xs ys) es la &lt;br /&gt;
-- distancia de Hamming entre xs e ys. Por ejemplo,&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;comino&amp;quot;  ==  2&lt;br /&gt;
--    distancia &amp;quot;roma&amp;quot;   &amp;quot;camino&amp;quot;  ==  3&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;ron&amp;quot;     ==  1&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;cama&amp;quot;    ==  2&lt;br /&gt;
--    distancia &amp;quot;romano&amp;quot; &amp;quot;rama&amp;quot;    ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
distancia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia xs ys = length (distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Definimos la función auxiliar:&lt;br /&gt;
&lt;br /&gt;
distanciaAux :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
distanciaAux xs [] = []&lt;br /&gt;
distanciaAux [] ys = []&lt;br /&gt;
distanciaAux (x:xs) (y:ys) | x == y =distanciaAux xs ys&lt;br /&gt;
                           | otherwise =[1]++(distanciaAux xs ys)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
distancia&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
distancia&amp;#039; xs ys = sum [ 1 | (a,b)&amp;lt;-zip xs ys, a/=b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    factoriales :: [Integer]&lt;br /&gt;
-- tal que factoriales es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Por comprensión:&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [1]++[product [1..n] | n &amp;lt;-[1..]]&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- Usando zipWith:&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = [1]++(zipWith f [1..] [2..])&lt;br /&gt;
               where f n y = product ([1..n]++[y])&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Por recursiÃ³n:&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1:(aux 1 [1..])&lt;br /&gt;
               where aux n (x:xs)= (n*x):(aux (n*x) xs)&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando scanl1:&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = scanl  (*) 1 [1..]&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- Usando iterate:&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- Comparación de los tiempos de evaluación:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales1&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
&lt;br /&gt;
(0.02 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales2&lt;br /&gt;
[1,2,6,24,120,720,5040,40320,362880,3628800]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales3&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 528020 bytes)&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; take 10 factoriales4&lt;br /&gt;
[1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
(0.00 secs, 0 bytes)&lt;br /&gt;
&lt;br /&gt;
Pablo José Gerlach Mena&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.0. En los siguientes ejercicios se demostrarán&lt;br /&gt;
-- propiedades de los árboles binarios definidos como sigue&lt;br /&gt;
--    data Arbol a = Hoja &lt;br /&gt;
--                 | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Como ejemplos se usarán los árboles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = Hoja &lt;br /&gt;
             | Nodo a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
arbol_1 = Nodo 9&lt;br /&gt;
               (Nodo 3 &lt;br /&gt;
                     (Nodo 2 Hoja Hoja) &lt;br /&gt;
                     (Nodo 4 Hoja Hoja)) &lt;br /&gt;
               (Nodo 7 Hoja Hoja)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
--    *Main&amp;gt; espejo arbol_1&lt;br /&gt;
--    Nodo 9 &lt;br /&gt;
--         (Nodo 7 Hoja Hoja) &lt;br /&gt;
--         (Nodo 3 &lt;br /&gt;
--               (Nodo 4 Hoja Hoja) &lt;br /&gt;
--               (Nodo 2 Hoja Hoja))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo Hoja = Hoja&lt;br /&gt;
espejo (Nodo a i d)= Nodo a (espejo d) (espejo i)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.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;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo n = (espejo . espejo) n == n&lt;br /&gt;
 &lt;br /&gt;
-- quickCheck prop_espejo&lt;br /&gt;
-- +++ OK passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Demostrar por inducciÃ³n que para todo Ã¡rbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
{-&lt;br /&gt;
 DemostraciÃ³n por inducciÃ³n en x&lt;br /&gt;
&lt;br /&gt;
[Caso base: Hoja]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo Hoja) = espejo (Hoja) por definicion de espejo Hoja&lt;br /&gt;
espejo (Hoja) = Hoja por definicion de espejo Hoja&lt;br /&gt;
&lt;br /&gt;
Luego  espejo (espejo Hoja)= Hoja &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
[Suponemos que espejo (espejo x) = x , para todo x arbol]&lt;br /&gt;
&lt;br /&gt;
[Sea N a i d con i, d arboles]&lt;br /&gt;
&lt;br /&gt;
espejo (espejo (N a i d))= espejo (N a (espejo d) (espejo i)) por def&lt;br /&gt;
espejo (N a (espejo d)(espejo i)) = N a (espejo (espejo i))&lt;br /&gt;
                                                        (espejo(espejo&lt;br /&gt;
                                                                d)) por def&lt;br /&gt;
&lt;br /&gt;
como i, d son arboles por hipótesis de induccion&lt;br /&gt;
&lt;br /&gt;
= N a (espejo (espejo i)) (espejo (espejo d))&lt;br /&gt;
= N a i d&lt;br /&gt;
&lt;br /&gt;
Luego espejo (espejo (N a i d)) = N a i d.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
Emilio Martinez &lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 -- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; preorden arbol_1&lt;br /&gt;
--    [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden Hoja = []&lt;br /&gt;
preorden (Nodo a i d)= [a]++(preorden i)++(preorden d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; postorden arbol_1&lt;br /&gt;
--    [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden Hoja = []&lt;br /&gt;
postorden (Nodo a i d)= postorden i ++ [a]++ postorden d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Realizado por Nikola Drousie:&lt;br /&gt;
&lt;br /&gt;
postorden&amp;#039; :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden&amp;#039; Hoja = []&lt;br /&gt;
postorden&amp;#039; (Nodo a i d) = postorden&amp;#039; i ++ postorden&amp;#039; d ++ [a]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck que para todo Ã¡rbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (postorden 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 = (postorden . espejo) x == (reverse . postorden) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
--quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez Rivero&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.7. Demstrar por inducción que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración por inducción en x.&lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.8. 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;
--    *Main&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.9. Demostrar que para todo árbol binario x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = preorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración:&lt;br /&gt;
    reverse (preorden (espejo x))&lt;br /&gt;
    = postorden (espejo (espejo x))    [por ejercicio 13.7]&lt;br /&gt;
    = postorden x                      [por ejercicio 13.3]&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.10. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; nNodos arbol_1&lt;br /&gt;
--    5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos Hoja = 0&lt;br /&gt;
nNodos (Nodo _ i d)= 1+(nNodos i)+(nNodos d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.11. Comprobar con QuickCheck que el nÃºmero de nodos de la&lt;br /&gt;
-- imagen especular de un Ã¡rbol es el mismo que el nÃºmero de nodos del&lt;br /&gt;
-- Ã¡rbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodos_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodos_espejo x = nNodos x == (nNodos . espejo) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobaciÃ³n es&lt;br /&gt;
&lt;br /&gt;
--  quickCheck prop_nNodos_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.12. Demostrar por inducción que el número de nodos de la&lt;br /&gt;
-- imagen especular de un árbol es el mismo que el número de nodos del&lt;br /&gt;
-- árbol. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.13. 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.&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 = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.14. Demostrar por inducción 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.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
{-&lt;br /&gt;
 Demostración: &lt;br /&gt;
&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.15. 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;
--    *Main&amp;gt; arbol_1&lt;br /&gt;
--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)&lt;br /&gt;
--    *Main&amp;gt; profundidad arbol_1&lt;br /&gt;
--    3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad Hoja = 0&lt;br /&gt;
profundidad (Nodo _ i d) = 1+ max(profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
--Emilio Martinez&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.16. Comprobar con QuickCheck que para todo árbol binario&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 = 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;
&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       = return Hoja &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [return Hoja,&lt;br /&gt;
                             liftM3 Nodo arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rocrodhue</name></author>
		
	</entry>
</feed>