<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/RA2017/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jospermon1</id>
	<title>Razonamiento automático (2017-18) - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/RA2017/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jospermon1"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2017/index.php/Especial:Contribuciones/Jospermon1"/>
	<updated>2026-07-17T11:34:42Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_7&amp;diff=317</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_7&amp;diff=317"/>
		<updated>2018-03-01T12:06:58Z</updated>

		<summary type="html">&lt;p&gt;Jospermon1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R7: Deducción natural proposicional en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R7_Deduccion_natural_proposicional&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;
&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, mt y not_ex 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;
(* edupalhid *)&lt;br /&gt;
lemma notnotE: &amp;quot;¬¬P ⟹ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(*anddonram*)&lt;br /&gt;
lemma ej_1:&lt;br /&gt;
  assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
   shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    show 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume 4: &amp;quot;¬q&amp;quot;&lt;br /&gt;
      have 5: &amp;quot;¬p&amp;quot; using 1 4 by (rule impE)&lt;br /&gt;
      then show False using 2 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*luicedval cesgongut oscgonesc diwu2 rafcabgon jescudero rafferrod macmerflo davperriv jospermon1*)&lt;br /&gt;
lemma ej_1_2:&lt;br /&gt;
  assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;¬¬p&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
    have 4: &amp;quot;¬¬q&amp;quot; using 1 3 by (rule mt) &lt;br /&gt;
    have 5: &amp;quot;q&amp;quot; using 4 by (rule notnotD) } &lt;br /&gt;
  thus &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
(* edupalhid*)&lt;br /&gt;
lemma ej_1_3: &lt;br /&gt;
  assumes &amp;quot;¬q⟶¬p&amp;quot;&lt;br /&gt;
  shows &amp;quot;p⟶q&amp;quot;&lt;br /&gt;
proof(rule impI)&lt;br /&gt;
  assume 1:&amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q&amp;quot;&lt;br /&gt;
  proof-&lt;br /&gt;
    have 2:&amp;quot;¬¬p&amp;quot; using 1 by (rule notnotI)&lt;br /&gt;
    have &amp;quot;¬¬q&amp;quot; using assms(1) 2 by (rule mt)&lt;br /&gt;
    then show &amp;quot;q&amp;quot; by (rule notnotE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval oscgonesc diwu2 rafcabgon jescudero davperriv macmerflo jospermon1*)&lt;br /&gt;
lemma l_e_m:&lt;br /&gt;
  &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma ej_2:&lt;br /&gt;
  assumes 1:&amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  { &lt;br /&gt;
    assume 2: &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p ∨ q&amp;quot; using 2 by (rule disjI2)&lt;br /&gt;
  }&lt;br /&gt;
  moreover{&lt;br /&gt;
    assume 4:&amp;quot;¬q&amp;quot;&lt;br /&gt;
    show &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
     proof(rule disjI1)&lt;br /&gt;
      show &amp;quot;p&amp;quot;&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume 5:&amp;quot;¬p&amp;quot;&lt;br /&gt;
        then have &amp;quot;¬p ∧ ¬q&amp;quot; using 4 by (rule conjI)&lt;br /&gt;
        with 1 show False by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  }&lt;br /&gt;
  moreover&lt;br /&gt;
  show 1: &amp;quot;q ∨ ¬q&amp;quot; by (rule l_e_m)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
lemma conjnotDM1:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
assume &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  have &amp;quot;p&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have &amp;quot;q&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
      have &amp;quot;¬p ∧ ¬q&amp;quot; using `¬p` `¬q` ..&lt;br /&gt;
      then show False using assms by contradiction&lt;br /&gt;
    qed&lt;br /&gt;
    then have &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    then show False using `¬(p ∨ q)` by contradiction&lt;br /&gt;
  qed&lt;br /&gt;
  then have &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
  then show False using `¬(p ∨ q)` by contradiction&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
&lt;br /&gt;
lemma ej_2_2:&lt;br /&gt;
    assumes 1:&amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
    shows  &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof (cases)&lt;br /&gt;
 assume &amp;quot;p&amp;quot;&lt;br /&gt;
 then show &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
 assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
 then have &amp;quot;q&amp;quot; using 1 by simp&lt;br /&gt;
 then show &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval cesgongut oscgonesc diwu2 rafcabgon jescudero rafferrod macmerflo davperriv jospermon1*)&lt;br /&gt;
lemma ej_3:&lt;br /&gt;
  assumes 1:&amp;quot; ¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;p&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    then have &amp;quot;(¬p ∨ ¬q)&amp;quot; by (rule disjI1)&lt;br /&gt;
    with 1 show False by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;q&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
    then have &amp;quot;(¬p ∨ ¬q)&amp;quot; by (rule disjI2)&lt;br /&gt;
    with 1 show False by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
lemma ej_3_2:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
 proof (rule conjI)&lt;br /&gt;
  { assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    hence &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
    with assms have False by (rule notE)}&lt;br /&gt;
  then show &amp;quot;p&amp;quot; by (rule ccontr)&lt;br /&gt;
  { assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
    hence &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
    with assms have False by (rule notE)}&lt;br /&gt;
  then show &amp;quot;q&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval rafcabgon jescudero rafferrod davperriv macmerflo jospermon1*)&lt;br /&gt;
lemma ej_4:&lt;br /&gt;
  assumes 1: &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof(rule disjE)&lt;br /&gt;
  {&lt;br /&gt;
    assume 2:&amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
    proof (rule disjI2)&lt;br /&gt;
      show &amp;quot;¬q&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume &amp;quot;q&amp;quot;&lt;br /&gt;
        with 2 have &amp;quot;p∧q&amp;quot; by (rule conjI)&lt;br /&gt;
        with 1 show False by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  }&lt;br /&gt;
  moreover&lt;br /&gt;
  {&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    then show &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1) &lt;br /&gt;
  }&lt;br /&gt;
  moreover&lt;br /&gt;
  show 1: &amp;quot;p ∨ ¬p&amp;quot; by (rule l_e_m)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cesgongut oscgonesc diwu2  edupalhid*)&lt;br /&gt;
lemma conjDM1:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  then have &amp;quot;p ∧ q&amp;quot; by (rule ej_3)&lt;br /&gt;
  with assms show False by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval oscgonesc diwu2 rafcabgon rafferrod macmerflo davperriv jospermon1*)&lt;br /&gt;
lemma ej_5:&lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule disjE) &lt;br /&gt;
  &lt;br /&gt;
  { &lt;br /&gt;
    assume 2: &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
    proof(rule disjI1)&lt;br /&gt;
      show &amp;quot;p ⟶ q&amp;quot; using 2 by (rule impI)&lt;br /&gt;
    qed&lt;br /&gt;
  }&lt;br /&gt;
  moreover{&lt;br /&gt;
    assume 4:&amp;quot; ¬q&amp;quot;&lt;br /&gt;
    show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
     proof(rule disjI2)&lt;br /&gt;
      show &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
      proof (rule impI)&lt;br /&gt;
        assume 5:&amp;quot;q&amp;quot;&lt;br /&gt;
        with 4 show &amp;quot;p&amp;quot;  by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  }&lt;br /&gt;
  moreover&lt;br /&gt;
  show 1: &amp;quot;q ∨ ¬q&amp;quot; by (rule l_e_m)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
lemma disjDM1:&lt;br /&gt;
  assumes &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; proof (rule notI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    then have &amp;quot;p ∨ q&amp;quot; ..&lt;br /&gt;
    then show False using assms by contradiction&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;¬q&amp;quot; proof (rule notI)&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    then have &amp;quot;p ∨ q&amp;quot; ..&lt;br /&gt;
    then show False using assms by contradiction&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma notimpD1:&lt;br /&gt;
  assumes &amp;quot;¬(p ⟶ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ ¬q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;¬q&amp;quot; proof (rule notI)&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    have &amp;quot;p ⟶ q&amp;quot; proof (rule impI)&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        then show False using `q` by contradiction&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
    then show False using assms by contradiction&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;p&amp;quot; proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have &amp;quot;p ⟶ q&amp;quot; proof (rule impI)&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        show False using `p` `¬p` by contradiction&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
    then show False using assms by contradiction&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ej5b: &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬?thesis&amp;quot;&lt;br /&gt;
  then have &amp;quot;¬(p ⟶ q) ∧ ¬(q ⟶ p)&amp;quot; by (rule disjDM1)&lt;br /&gt;
  then have &amp;quot;¬(p ⟶ q)&amp;quot; ..&lt;br /&gt;
  then have &amp;quot;p ∧ ¬q&amp;quot; by (rule notimpD1)&lt;br /&gt;
  then have &amp;quot;p&amp;quot; ..&lt;br /&gt;
  have &amp;quot;¬(q ⟶ p)&amp;quot; using `¬(p ⟶ q) ∧ ¬(q ⟶ p)` ..&lt;br /&gt;
  then have &amp;quot;q ∧ ¬p&amp;quot; by (rule notimpD1)&lt;br /&gt;
  then have &amp;quot;¬p&amp;quot; ..&lt;br /&gt;
  then show False using `p` by contradiction&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*edupalhid*)&lt;br /&gt;
lemma ej_5c:&lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof(cases)&lt;br /&gt;
  assume &amp;quot;(p ⟶ q)&amp;quot;&lt;br /&gt;
  then show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬ (p ⟶ q)&amp;quot;&lt;br /&gt;
  then have 1:&amp;quot;¬(¬p∨q)&amp;quot; using equiv by simp&lt;br /&gt;
  have &amp;quot;p∧¬q&amp;quot; using 1 by auto&lt;br /&gt;
  then have &amp;quot;q ⟶ p&amp;quot; by auto&lt;br /&gt;
  then show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)&lt;br /&gt;
qed&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jospermon1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_5&amp;diff=316</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_5&amp;diff=316"/>
		<updated>2018-03-01T11:57:02Z</updated>

		<summary type="html">&lt;p&gt;Jospermon1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R5: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R5_Recorridos_de_arboles&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que tiene información en los nodos y en las hojas. &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
     a   d f   h &lt;br /&gt;
  se representa por &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H &amp;quot;&amp;#039;a&amp;quot; | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (preOrden a) es el recorrido pre orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     preOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* luicedval anddonram oscgonesc diwu2 rafcabgon macmerflo edupalhid jescudero rafferrod cesgongut jospermon1*)&lt;br /&gt;
fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrden (H x) = [x]&amp;quot;&lt;br /&gt;
|  &amp;quot;preOrden (N x i d) = x # preOrden i @ preOrden d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))  &lt;br /&gt;
      = [e,c,a,d,g,f,h]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función &lt;br /&gt;
     postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (postOrden a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     postOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* luicedval anddonram oscgonesc diwu2 rafcabgon macmerflo edupalhid jescudero rafferrod cesgongut jospermon1*)&lt;br /&gt;
fun postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrden (H x) = [x]&amp;quot;&lt;br /&gt;
|  &amp;quot;postOrden (N x i d) = postOrden i @ postOrden d @ [x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;postOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
       = [a,d,c,f,h,g,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inOrden a) es el recorrido in orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     inOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [a,c,d,e,f,g,h]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* luicedval anddonram oscgonesc diwu2 rafcabgon macmerflo edupalhid jescudero rafferrod cesgongut jospermon1*)&lt;br /&gt;
fun inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
   &amp;quot;inOrden (H x) = [x]&amp;quot;&lt;br /&gt;
|  &amp;quot;inOrden (N x i d) = inOrden i @ x # inOrden d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
       = [a,c,d,e,f,g,h]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot;&lt;br /&gt;
  tal que (espejo a) es la imagen especular del árbol a. Por ejemplo, &lt;br /&gt;
     espejo (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = N e (N g (H h) (H f)) (N c (H d) (H a))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* luicedval anddonram oscgonesc diwu2 rafcabgon macmerflo edupalhid jescudero rafferrod cesgongut jospermon1*)&lt;br /&gt;
fun espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;espejo (H x) = (H x)&amp;quot;&lt;br /&gt;
| &amp;quot;espejo (N x i d) = (N x (espejo d) (espejo i))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;espejo (N e (N c (H a) (H d)) (N g (H f) (H h))) &lt;br /&gt;
       = N e (N g (H h) (H f)) (N c (H d) (H a))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que&lt;br /&gt;
     preOrden (espejo a) = rev (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* luicedval oscgonesc diwu2 rafcabgon macmerflo edupalhid rafferrod jospermon1*)&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
  by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a) &lt;br /&gt;
  fix x::&amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. preOrden (espejo (H x)) = rev (postOrden (H x))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume H1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume H2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x i d)) = preOrden  (N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x # preOrden (espejo d) @ preOrden (espejo i)&amp;quot;  by simp&lt;br /&gt;
  also have &amp;quot;... = x # rev (postOrden d) @ rev (postOrden i)&amp;quot; using H1 H2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden i) @ (postOrden d) @ [x])&amp;quot;  by simp&lt;br /&gt;
  finally show &amp;quot;preOrden (espejo (N x i d)) = rev (postOrden (N x i d))&amp;quot;  by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*anddonram*)&lt;br /&gt;
lemma&lt;br /&gt;
 fixes a :: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
 shows &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  (*Si no pones el tipo da un warning. ¿Por qué?*)&lt;br /&gt;
  fix x::&amp;#039;b&lt;br /&gt;
  show &amp;quot; preOrden (espejo (H x)) = rev (postOrden (H x))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x1a&lt;br /&gt;
  (*Si no pones el tipo da un error. ¿Por qué?*)&lt;br /&gt;
  fix a1:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H1:&amp;quot; preOrden (espejo a1) = rev (postOrden a1)&amp;quot;&lt;br /&gt;
  fix a2:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H2:&amp;quot; preOrden (espejo a2) = rev (postOrden a2)&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x1a a1 a2)) = preOrden  (N x1a (espejo a2) (espejo a1)) &amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = [x1a] @ (preOrden (espejo a2)) @ (preOrden (espejo a1)) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = [x1a] @ rev (postOrden a2) @ rev (postOrden a1) &amp;quot; using H1 H2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (postOrden a1) @ (postOrden a2) @ [x1a]) &amp;quot;  by simp&lt;br /&gt;
  finally show &amp;quot;preOrden (espejo (N x1a a1 a2)) = rev (postOrden (N x1a a1 a2)) &amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
(* creo que es lo mismo que luicedval et al. *)&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;preOrden (espejo (N x i d)) =&lt;br /&gt;
          preOrden (N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev (postOrden (N x i d))&amp;quot; using h1 h2 by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que&lt;br /&gt;
     postOrden (espejo a) = rev (preOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* luicedval oscgonesc diwu2 rafcabgon macmerflo edupalhid jescudero rafferrod cesgongut jospermon1 *)&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
  by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a) &lt;br /&gt;
  fix x::&amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. postOrden (espejo (H x)) = rev (preOrden (H x))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume H1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume H2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x i d)) = postOrden  (N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden (espejo d) @ postOrden (espejo i) @ [x]&amp;quot;  by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden d) @ rev (preOrden i) @ [x]&amp;quot; using H1 H2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x # (preOrden i) @ (preOrden d))&amp;quot;  by simp&lt;br /&gt;
  finally show &amp;quot;postOrden (espejo (N x i d)) = rev (preOrden (N x i d))&amp;quot;  by simp&lt;br /&gt;
 qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*anddonram*)&lt;br /&gt;
lemma&lt;br /&gt;
 fixes a :: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
 shows &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;#039;b&lt;br /&gt;
  show &amp;quot;postOrden (espejo (H x)) = rev (preOrden (H x))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x1a&lt;br /&gt;
  fix a1:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H1:&amp;quot;postOrden (espejo a1) = rev (preOrden a1)&amp;quot;&lt;br /&gt;
  fix a2:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H2:&amp;quot;postOrden (espejo a2) = rev (preOrden a2)&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x1a a1 a2)) = postOrden  (N x1a (espejo a2) (espejo a1)) &amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = (postOrden (espejo a2)) @ (postOrden (espejo a1)) @ [x1a] &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden a2) @ rev (preOrden a1) @ [x1a]&amp;quot; using H1 H2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev([x1a] @ (preOrden a1) @ (preOrden a2) ) &amp;quot;  by simp&lt;br /&gt;
  finally show &amp;quot;postOrden (espejo (N x1a a1 a2)) = rev (preOrden (N x1a a1 a2))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* luicedval oscgonesc diwu2 rafcabgon macmerflo edupalhid rafferrod cesgongut jospermon1*)&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
  by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a) &lt;br /&gt;
  fix x::&amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. inOrden (espejo (H x)) = rev (inOrden (H x))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume H1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume H2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N x i d)) = inOrden  (N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden (espejo d) @ x # (inOrden (espejo i)) &amp;quot;  by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden d) @ x # rev (inOrden i) &amp;quot; using H1 H2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (inOrden i) @ x # (inOrden d)) &amp;quot;  by simp&lt;br /&gt;
  finally show &amp;quot;inOrden (espejo (N x i d)) = rev (inOrden (N x i d))&amp;quot;  by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*anddonram*) &lt;br /&gt;
theorem &lt;br /&gt;
 fixes a :: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
 shows &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;#039;b&lt;br /&gt;
  show &amp;quot;inOrden (espejo (H x)) = rev (inOrden (H x))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x1a&lt;br /&gt;
  fix a1:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H1:&amp;quot; inOrden (espejo a1) = rev (inOrden a1)&amp;quot;&lt;br /&gt;
  fix a2:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H2:&amp;quot; inOrden (espejo a2) = rev (inOrden a2)&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N x1a a1 a2)) = inOrden  (N x1a (espejo a2) (espejo a1)) &amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = (inOrden (espejo a2)) @ [x1a]@ (inOrden (espejo a1))  &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a2) @ [x1a] @ rev (inOrden a1) &amp;quot; using H1 H2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((inOrden a1) @ [x1a] @ (inOrden a2) ) &amp;quot;  by simp&lt;br /&gt;
  finally show &amp;quot; inOrden (espejo (N x1a a1 a2)) = rev (inOrden (N x1a a1 a2))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función &lt;br /&gt;
     raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (raiz a) es la raiz del árbol a. Por ejemplo, &lt;br /&gt;
     raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* luicedval anddonram oscgonesc diwu2 rafcabgon macmerflo edupalhid rafferrod cesgongut jospermon1*)&lt;br /&gt;
fun raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;raiz (H x) = x&amp;quot;&lt;br /&gt;
|  &amp;quot;raiz (N x i d) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función &lt;br /&gt;
     extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_izquierda a) es el nodo más a la izquierda del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* luicedval anddonram oscgonesc diwu2 rafcabgon macmerflo edupalhid rafferrod cesgongut jospermon1*)&lt;br /&gt;
fun extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_izquierda (H x) = x&amp;quot;&lt;br /&gt;
| &amp;quot;extremo_izquierda (N x i d) = extremo_izquierda i&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función &lt;br /&gt;
     extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_derecha a) es el nodo más a la derecha del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* luicedval anddonram oscgonesc diwu2 rafcabgon macmerflo edupalhid rafferrod cesgongut jospermon1*)&lt;br /&gt;
fun extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_derecha (H x) = x&amp;quot;&lt;br /&gt;
| &amp;quot;extremo_derecha (N x i d) = extremo_derecha d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     last (inOrden a) = extremo_derecha a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram*)&lt;br /&gt;
lemma inOrdenNoVacio: &amp;quot;inOrden a ≠ []&amp;quot; by (cases a) auto&lt;br /&gt;
theorem&lt;br /&gt;
 fixes a :: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
 shows &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;#039;b&lt;br /&gt;
  show &amp;quot;last (inOrden (H x)) = extremo_derecha (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x1a&lt;br /&gt;
  fix a1:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H1:&amp;quot;last (inOrden a1) = extremo_derecha a1&amp;quot;&lt;br /&gt;
  fix a2:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H2:&amp;quot;last (inOrden a2) = extremo_derecha a2&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N x1a a1 a2)) = last( (inOrden a1) @ [x1a] @ (inOrden a2)) &amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = last( [x1a] @ inOrden a2)  &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last (inOrden a2)  &amp;quot; by (simp add:inOrdenNoVacio)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha a2 &amp;quot; using H2 by simp&lt;br /&gt;
  finally show &amp;quot;last (inOrden (N x1a a1 a2)) = extremo_derecha (N x1a a1 a2)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* luicedval oscgonesc diwu2 rafcabgon macmerflo edupalhid rafferrod cesgongut jospermon1*)&lt;br /&gt;
lemma inOrdenNoVacio: &amp;quot;inOrden a ≠ []&amp;quot; by (cases a) auto&lt;br /&gt;
(* Créditos Andrés, no sabía como hacerlo *)&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. ?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i&lt;br /&gt;
  fix d assume H1: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N x i d)) = last (inOrden i @ x # inOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last (x # inOrden d)&amp;quot;  by simp&lt;br /&gt;
  also have &amp;quot;... = last (inOrden d)&amp;quot; by (simp add:inOrdenNoVacio)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha d&amp;quot; using H1 by simp&lt;br /&gt;
  finally show &amp;quot;last (inOrden (N x i d)) = extremo_derecha (N x i d)&amp;quot;  by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = extremo_izquierda a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram*)&lt;br /&gt;
theorem&lt;br /&gt;
 fixes a :: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
 shows &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;#039;b&lt;br /&gt;
  show &amp;quot;hd (inOrden (H x)) = extremo_izquierda (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x1a&lt;br /&gt;
  fix a1:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H1:&amp;quot; hd (inOrden a1) = extremo_izquierda a1&amp;quot;&lt;br /&gt;
  fix a2:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H2:&amp;quot; hd (inOrden a2) = extremo_izquierda a2&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N x1a a1 a2)) = hd ( (inOrden a1) @ [x1a] @ (inOrden a2)) &amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden a1)  &amp;quot; by (simp add:inOrdenNoVacio)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda a1 &amp;quot; using H1 by simp&lt;br /&gt;
  finally show &amp;quot; hd (inOrden (N x1a a1 a2)) = extremo_izquierda (N x1a a1 a2)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* luicedval oscgonesc diwu2 rafcabgon macmerflo edupalhid rafferrod cesgongut jospermon1*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. ?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume H1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d&lt;br /&gt;
  have &amp;quot;hd (inOrden (N x i d)) = hd (inOrden i @ x # inOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden i)&amp;quot;  by (simp add:inOrdenNoVacio)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda i&amp;quot; using H1 by simp&lt;br /&gt;
  finally show &amp;quot;hd (inOrden (N x i d)) = extremo_izquierda (N x i d)&amp;quot;  by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = last (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram*)&lt;br /&gt;
theorem&lt;br /&gt;
 fixes a :: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
 shows &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;#039;b&lt;br /&gt;
  show &amp;quot;hd (preOrden (H x)) = last (postOrden (H x))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x1a&lt;br /&gt;
  fix a1:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H1:&amp;quot;hd (preOrden a1) = last (postOrden a1)&amp;quot;&lt;br /&gt;
  fix a2:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H2:&amp;quot;hd (preOrden a2) = last (postOrden a2)&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden (N x1a a1 a2)) = hd ( [x1a] @ (preOrden a1) @ (preOrden a2)) &amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = x1a  &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last ((preOrden a1) @ (preOrden a2)@ [x1a])&amp;quot;  by simp&lt;br /&gt;
  finally show &amp;quot;hd (preOrden (N x1a a1 a2)) = last (postOrden (N x1a a1 a2))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* luicedval rafcabgon rafferrod*)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. ?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume H1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume H2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden (N x i d)) = hd (x # preOrden i @ preOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = last (postOrden d @ postOrden i @ [x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;hd (preOrden (N x i d)) = last (postOrden (N x i d))&amp;quot;  by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;hd (preOrden (N x i d)) = hd (x # preOrden d @ preOrden i)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
    next&lt;br /&gt;
    have &amp;quot;last (postOrden (N x i d)) =&lt;br /&gt;
          last (postOrden d @ postOrden i @ [x])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
 (*anddonram diwu2 *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;#039;b&lt;br /&gt;
  show &amp;quot;hd (preOrden (H x)) = raiz (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x1a&lt;br /&gt;
  fix a1:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H1:&amp;quot; hd (preOrden a1) = raiz a1&amp;quot;&lt;br /&gt;
  fix a2:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H2:&amp;quot; hd (preOrden a2) = raiz a2&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden (N x1a a1 a2)) = hd ( [x1a] @ (preOrden a1) @ (preOrden a2)) &amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = x1a &amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;hd (preOrden (N x1a a1 a2)) = raiz (N x1a a1 a2)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
(* luicedval rafcabgon macmerflo rafferrod cesgongut jospermon1*)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. ?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume H1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume H2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden (N x i d)) = hd (x # preOrden i @ preOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp &lt;br /&gt;
  finally show &amp;quot;hd (preOrden (N x i d)) = raiz (N x i d)&amp;quot;  by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz  a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
 (*anddonram luicedval oscgonesc diwu2 rafcabgon macmerflo edupalhid jescudero rafferrod cesgongut jospermon1*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
  quickcheck&lt;br /&gt;
oops&lt;br /&gt;
 (*&lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
  a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
  hd (inOrden a) = a⇩2&lt;br /&gt;
  raiz a = a⇩1&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar&lt;br /&gt;
     last (postOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
 (*anddonram*)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;#039;b&lt;br /&gt;
  show &amp;quot;last (postOrden (H x)) = raiz (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x1a&lt;br /&gt;
  fix a1:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H1:&amp;quot;last (postOrden a1) = raiz a1 &amp;quot;&lt;br /&gt;
  fix a2:: &amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  assume H2:&amp;quot;last (postOrden a2) = raiz a2&amp;quot;&lt;br /&gt;
  have &amp;quot; last (postOrden (N x1a a1 a2)) = last ( (preOrden a1) @ (preOrden a2)@[x1a] ) &amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = x1a &amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot; last (postOrden (N x1a a1 a2)) = raiz (N x1a a1 a2)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* luicedval oscgonesc diwu2 rafcabgon macmerflo rafferrod cesgongut jospermon1*)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;b arbol&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. ?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume H1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume H2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;last (postOrden (N x i d)) = last (postOrden i @ postOrden d @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last (postOrden d @ [x])&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;last (postOrden (N x i d)) = raiz (N x i d)&amp;quot;  by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
apply (induct a)&lt;br /&gt;
apply simp&lt;br /&gt;
apply simp&lt;br /&gt;
done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
  fix x i d&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jospermon1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_2&amp;diff=315</id>
		<title>Relación 2</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_2&amp;diff=315"/>
		<updated>2018-03-01T11:52:27Z</updated>

		<summary type="html">&lt;p&gt;Jospermon1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R2: Razonamiento sobre programas en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R2_Razonamiento_automatico_sobre_programas&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
declare [[names_short]]&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1.1. Definir la función&lt;br /&gt;
     sumaImpares :: nat ⇒ nat&lt;br /&gt;
  tal que (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 5  =  25&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram  edupalhid macmerflo luicedval rafcabgon jescudero&lt;br /&gt;
   davperriv diwu2 rafferrod jospermon1 *)  &lt;br /&gt;
fun sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0 = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sumaImpares (Suc n) = 2*(Suc n) - 1 + sumaImpares n&amp;quot; &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaImpares 5 = 25&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
fun sumaImpares2 :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares2 0 = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaImpares2 (Suc n) = 2*n + 1 + sumaImpares2 n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaImpares2 5 = 25&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1.2. Demostrar que &lt;br /&gt;
     sumaImpares n = n*n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid macmerflo luicedval rafcabgon davperriv diwu2&lt;br /&gt;
   jescudero rafferrod jospermon1*) &lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  by(induct n) simp_all&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
lemma &amp;quot;sumaImpares2 n = n*n&amp;quot;&lt;br /&gt;
  apply (induct n) &lt;br /&gt;
    apply simp&lt;br /&gt;
    apply simp&lt;br /&gt;
  done&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid macmerflo luicedval rafcabgon davperriv diwu2&lt;br /&gt;
   jescudero rafferrod cesgongut jospermon1*) &lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
   &amp;quot;sumaPotenciasDeDosMasUno 0 = 1 + 1&amp;quot;&lt;br /&gt;
 |  &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^(Suc n) + sumaPotenciasDeDosMasUno n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno 3 = 16&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.2. Demostrar que &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid macmerflo luicedval rafcabgon davperriv diwu2&lt;br /&gt;
   jescudero rafferrod cesgongut jospermon1*) &lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  by(induct n) simp_all&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid macmerflo luicedval rafcabgon davperriv diwu2&lt;br /&gt;
   jescudero rafferrod cesgongut jospermon1*) &lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia 0 x = []&amp;quot;&lt;br /&gt;
| &amp;quot;copia (Suc n) x= x # copia n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;copia 3 x = [x,x,x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram luicedval macmerflo rafcabgon davperriv diwu2 rafferrod&lt;br /&gt;
   jescudero cesgongut jospermon1*) &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&amp;quot;&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
fun todos2 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos2 p []     = True&amp;quot; |&lt;br /&gt;
  &amp;quot;todos2 p (x#xs) = (if p x then todos2 p xs else False)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.3. Demostrar que todos los elementos de (copia n x) son&lt;br /&gt;
  iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid luicedval macmerflo rafcabgon davperriv diwu2&lt;br /&gt;
   rafferrod jescudero cesgongut jospermon1*) &lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  by (induct n) simp_all&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;todos2 (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  by (induct n) simp_all&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.1. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid luicedval macmerflo rafcabgon davperriv diwu2&lt;br /&gt;
   rafferrod jescudero cesgongut jospermon1*) &lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia [] y     = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;amplia [d,a] t = [d,a,t]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.2. Demostrar que &lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid luicedval macmerflo rafcabgon davperriv diwu2&lt;br /&gt;
   rafferrod jescudero cesgongut *) &lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  by (induct xs) simp_all&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jospermon1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_4&amp;diff=314</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_4&amp;diff=314"/>
		<updated>2018-03-01T11:48:55Z</updated>

		<summary type="html">&lt;p&gt;Jospermon1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R4: Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
theory R4_Cuantificadores_sobre_listas&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid luicedval cesgongut jescudero rafcabgon diwu2&lt;br /&gt;
   macmerflo rafferrod jospermon1*) &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3::nat]] = True&amp;quot;&lt;br /&gt;
value &amp;quot; ¬todos (λx. 1&amp;lt;length x) [[2,1,4],[3::nat]] = True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid luicedval cesgongut jescudero rafcabgon diwu2&lt;br /&gt;
   macmerflo rafferrod jospermon1*) &lt;br /&gt;
fun algunos  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos p []      = False&amp;quot;&lt;br /&gt;
|  &amp;quot;algunos p (x#xs) = (p x ∨ algunos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot; algunos (λx. 1&amp;lt;length x) [[2::nat,1,4],[3]] = True&amp;quot;&lt;br /&gt;
value &amp;quot; ¬algunos (λx. 1&amp;lt;length x) [[],[3::nat]] = True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Demostrar o refutar automáticamente &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 (* anddonram edupalhid luicedval cesgongut jescudero rafcabgon diwu2&lt;br /&gt;
    macmerflo rafferrod jospermon1*) &lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar o refutar detalladamente&lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram [conmutatividad and porque no sé hacerlo de otra forma] *)&lt;br /&gt;
lemma and_comm: &amp;quot;(a ∧ b) = (b ∧ a)&amp;quot;&lt;br /&gt;
  by (cases a) auto&lt;br /&gt;
&lt;br /&gt;
(* anddonram diwu2 *)&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = &lt;br /&gt;
       (P a ∧ Q a ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ Q a ∧ todos P xs ∧ todos Q xs)&amp;quot; &lt;br /&gt;
    using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ Q a ∧ todos Q xs ∧ todos P xs)&amp;quot; &lt;br /&gt;
    by (simp add: and_comm)&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos Q (a # xs) ∧ todos P xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P xs ∧ Q a ∧ todos Q xs)&amp;quot; &lt;br /&gt;
    by (simp add: and_comm)&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = &lt;br /&gt;
                (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot;&lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n xs&lt;br /&gt;
  assume HI: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot; &lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) (n # xs) =  &lt;br /&gt;
        ((P n ∧ Q n) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P n ∧ todos P xs) ∧ (Q n ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = ((todos P(n#xs)) ∧ (todos Q(n#xs)))&amp;quot; by simp&lt;br /&gt;
 finally show &amp;quot;todos (λx. P x ∧ Q x) (n#xs) = &lt;br /&gt;
               (todos P (n#xs) ∧ todos Q (n#xs))&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* rafferrod *)&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) (a#xs) = &lt;br /&gt;
       (P a ∧ Q a ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ Q a ∧ todos P xs ∧ todos Q xs)&amp;quot; &lt;br /&gt;
    using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P (xs) ∧ Q a ∧ todos Q (xs))&amp;quot; by auto&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a#xs) = &lt;br /&gt;
                (todos P (a#xs) ∧ todos Q (a#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix h xs&lt;br /&gt;
  assume HI: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) (h # xs)&lt;br /&gt;
      = ((λx. P x ∧ Q x) h ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P h ∧ Q h ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P h ∧ todos P xs ∧ Q h ∧ todos Q xs)&amp;quot; using HI by blast&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (h # xs)&lt;br /&gt;
              = (todos P (h # xs) ∧ todos Q (h # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.1. Demostrar o refutar automáticamente&lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid cesgongut luicedval jescudero rafcabgon diwu2&lt;br /&gt;
   macmerflo cesgongut rafferrod jospermon1*) &lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.2. Demostrar o refutar detalladamente&lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid luicedval rafcabgon diwu2 jescudero macmerflo&lt;br /&gt;
   cesgongut rafferrod jospermon1*) &lt;br /&gt;
lemma todos_append:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a x&lt;br /&gt;
  assume HI: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a # x) @ y) = (P a ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.1. Demostrar o refutar automáticamente &lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram*)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  by (induct xs) (simp_all add: todos_append and_comm)&lt;br /&gt;
&lt;br /&gt;
(* edupalhid diwu2 macmerflo rafferrod *)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: todos_append)&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
using todos_append by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.2. Demostrar o refutar detalladamente&lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram diwu2 *)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
 next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot; todos P (rev (a # xs)) = todos P (rev xs @ [a])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... =  (todos P (rev xs) ∧ todos P [a])&amp;quot; &lt;br /&gt;
    by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... =  (todos P xs ∧ todos P [a])&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (a # xs)) = todos P (a # xs)&amp;quot; &lt;br /&gt;
    by (simp add: and_comm)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
fix a xs&lt;br /&gt;
  assume HI: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P (rev (a # xs)) = (todos P ((rev xs)@[a]))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [a])&amp;quot; &lt;br /&gt;
    by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P a)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P xs)&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = (todos P (a#xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (a # xs)) = (todos P (a#xs))&amp;quot; by simp    &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* rafferrod cesgongut *)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    fix a xs&lt;br /&gt;
    assume HI: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
    have &amp;quot;todos P (rev (a#xs)) = todos P (rev xs @ [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (rev xs) ∧ todos P [a])&amp;quot; &lt;br /&gt;
      by (simp add: todos_append)&lt;br /&gt;
    also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P [a] ∧ todos P xs)&amp;quot; by auto  (*/ blast *)&lt;br /&gt;
    finally show &amp;quot;todos P (rev (a#xs)) = todos P (a#xs)&amp;quot; by simp&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar:&lt;br /&gt;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram Contraejemplo*)&lt;br /&gt;
value &amp;quot;let xs=[True,False]    &lt;br /&gt;
  in (algunos (λx. (λx. (x=False)) x ∧ (λx. x) x) xs =&lt;br /&gt;
     (algunos (λx. (x=False)) xs ∧ algunos (λx. x) xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* edupalhid diwu2 rafferrod cesgongut jospermon1*)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
  quickcheck&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7.1. Demostrar o refutar automáticamente &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid jescudero luicedval rafcabgon diwu2 macmerflo&lt;br /&gt;
   cesgongut rafferrod jospermon1*) &lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7.2. Demostrar o refutar datalladamente&lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid luicedval rafcabgon diwu2 jescudero macmerflo&lt;br /&gt;
   rafferrod jospermon1*) &lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof(induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (map f []) = algunos (P o f) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (map f xs) = algunos (P ∘ f) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (a # xs)) = algunos P (f a#map f xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P ∘ f) a ∨ algunos P (map f xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P ∘ f) a ∨ algunos (P ∘ f) xs) &amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (map f (a # xs)) = algunos (P ∘ f) (a # xs)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (map f []) = algunos (P o f) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (x#xs)) = (P (f x) ∨ algunos P (map f xs))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = (P (f x) ∨ algunos (P o f) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (map f (x#xs)) = algunos (P o f) (x#xs)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8.1. Demostrar o refutar automáticamente &lt;br /&gt;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid luicedval rafcabgon diwu2 jescudero macmerflo&lt;br /&gt;
   cesgongut rafferrod jospermon1*) &lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid luicedval rafcabgon diwu2 jescudero macmerflo&lt;br /&gt;
   cesgongut rafferrod jospermon1*) &lt;br /&gt;
lemma algunos_append:&lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P ([] @ ys) = (algunos P [] ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P ((a # xs) @ ys) = (P a ∨ algunos P (xs@ys) )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ (algunos P xs ∨ algunos P ys))&amp;quot; using HI &lt;br /&gt;
    by simp&lt;br /&gt;
  finally show &amp;quot;algunos P ((a # xs) @ ys) = &lt;br /&gt;
                (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9.1. Demostrar o refutar automáticamente&lt;br /&gt;
     algunos P (rev xs) = algunos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram [conmutatividad or porque no sé hacerlo de otra forma] *)&lt;br /&gt;
lemma or_comm: &amp;quot;(a ∨ b) = (b ∨ a)&amp;quot;&lt;br /&gt;
  by (cases a) auto&lt;br /&gt;
&lt;br /&gt;
(* anddonram *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  by (induct xs) (simp_all add: algunos_append or_comm)&lt;br /&gt;
 &lt;br /&gt;
(* edupalhid diwu2 rafferrod*)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: algunos_append)&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
using algunos_append by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P (rev xs) = algunos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram diwu2 *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot; algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot; algunos P (rev (a # xs)) = algunos P (rev xs @[a]) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ algunos P [a])&amp;quot; &lt;br /&gt;
    by (simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ P a)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs)&amp;quot; by (simp add:or_comm)&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (a # xs)) = algunos P (a # xs) &amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (a # xs)) = algunos P ((rev xs) @ [a])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((algunos P (rev xs)) ∨ (algunos P [a]))&amp;quot; &lt;br /&gt;
    by (simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = ((algunos P xs) ∨ (algunos P [a]))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((algunos P [a]) ∨ (algunos P xs))&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot;algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* rafferrod cesgongut *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (a#xs)) = algunos P (rev xs @ [a])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ algunos P [a])&amp;quot; &lt;br /&gt;
    by (simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ algunos P [a])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P [a] ∨ algunos P xs)&amp;quot; by auto (*/ blast *)&lt;br /&gt;
  finally show &amp;quot;algunos P (rev (a#xs)) = algunos P (a#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  y demostrar la equivalencia de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid diwu2 jescudero macmerflo rafferrod rafcabgon jospermon1*)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
 by (induct xs) auto&lt;br /&gt;
 &lt;br /&gt;
(* anddonram *)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos (λx. P x ∨ Q x) [] = (algunos P [] ∨ algunos Q [])&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos (λx. P x ∨ Q x) (a # xs) = &lt;br /&gt;
        (P a ∨ Q a ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ Q a ∨ algunos P xs ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ Q a ∨ algunos Q xs ∨ algunos P xs)&amp;quot; &lt;br /&gt;
    by (simp add: or_comm)&lt;br /&gt;
  also have &amp;quot;... = (P a ∨  algunos Q (a#xs) ∨ algunos P xs)&amp;quot;  by simp &lt;br /&gt;
  also have &amp;quot;... = (P a ∨  algunos P xs ∨ algunos Q (a#xs))&amp;quot; &lt;br /&gt;
    by (simp add: or_comm)&lt;br /&gt;
  finally show &amp;quot;algunos (λx. P x ∨ Q x) (a # xs) = &lt;br /&gt;
                (algunos P (a # xs) ∨ algunos Q (a # xs))&amp;quot;&lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
      (is &amp;quot;?T xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?T []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs assume HI: &amp;quot;?T xs&amp;quot;&lt;br /&gt;
    have p1:&amp;quot; (Q a ∨ algunos P xs) = (algunos P xs ∨ Q a)&amp;quot; &lt;br /&gt;
      by (simp add: HOL.disj_commute)&lt;br /&gt;
    have &amp;quot;algunos (λx. P x ∨ Q x) (a # xs) = &lt;br /&gt;
          (algunos P [a] ∨ algunos Q [a] ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = (P a ∨ (Q a ∨ algunos P xs) ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
      using HI by simp&lt;br /&gt;
    also have &amp;quot;… = (P a ∨ algunos P xs ∨ Q a ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
      using p1 by simp&lt;br /&gt;
    also have &amp;quot;… = (algunos P (a # xs) ∨ algunos Q (a # xs))&amp;quot; by simp&lt;br /&gt;
    finally show &amp;quot;?T (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* rafferrod *)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos (λx. P x ∨ Q x) [] = (algunos P [] ∨ algunos Q [])&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos (λx. P x ∨ Q x) (a#xs) = &lt;br /&gt;
       (P a ∨ Q a ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ Q a ∨ algunos P xs ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs ∨ Q a ∨ algunos Q xs)&amp;quot; by auto&lt;br /&gt;
  finally show &amp;quot;algunos (λx. P x ∨ Q x) (a#xs) = &lt;br /&gt;
                (algunos P (a#xs) ∨ algunos Q (a#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = algunos (λx. Q x ∨ P x) xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = algunos (λx. Q x ∨ P x) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos (λx. P x ∨ Q x) [] = algunos (λx. Q x ∨ P x) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix h xs&lt;br /&gt;
  assume HI: &amp;quot;algunos (λx. P x ∨ Q x) xs = algunos (λx. Q x ∨ P x) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos (λx. P x ∨ Q x) (h#xs)&lt;br /&gt;
      = ((λx. P x ∨ Q x) h ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = ((λx. P x ∨ Q x) h ∨ algunos (λx. Q x ∨ P x) xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = ((λx. Q x ∨ P x) h ∨ algunos (λx. Q x ∨ P x) xs)&amp;quot; by blast&lt;br /&gt;
  also have &amp;quot;… = algunos (λx. Q x ∨ P x) (h#xs)&amp;quot; by (simp add: algunos_append)&lt;br /&gt;
  finally show &amp;quot;algunos (λx. P x ∨ Q x) (h#xs)&lt;br /&gt;
              = algunos (λx. Q x ∨ P x) (h#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11.1. Demostrar o refutar automáticamente&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid diwu2 cesgongut rafferrod rafcabgon macmerflo jospermon1*)&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
 by (induct xs) auto&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11.2. Demostrar o refutar datalladamente&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram edupalhid diwu2 rafferrod cesgongut macmerflo *)&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P [] = (¬ todos (λx. (¬ P x)) [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;algunos P xs = (¬ todos (λx. ¬ P x) xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (a # xs) =(P a ∨ algunos P xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ (¬ todos (λx. ¬ P x) xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (¬ (¬ P a ∧ todos (λx. ¬ P x) xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;  algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhd luicedval rafcabgon diwu2 jescudero macmerflo&lt;br /&gt;
   cesgongut rafferrod jospermon1*) &lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []     = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = ((a=x) ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot; estaEn (2::nat) [3,2,4] = True&amp;quot;&lt;br /&gt;
value &amp;quot; estaEn (1::nat) [3,2,4] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  Demostrar dicha relación de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid luicedval rafcabgon diwu2 jescudero macmerflo&lt;br /&gt;
   cesgongut rafferrod jospermon1*) &lt;br /&gt;
lemma &amp;quot;estaEn x xs=algunos (λy.(y=x)) xs&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid luicedval rafcabgon jescudero macmerflo cesgongut&lt;br /&gt;
   rafferrod *) &lt;br /&gt;
lemma &amp;quot;estaEn x xs=algunos (λy.(y=x)) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn x []=algunos (λy.(y=x)) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;estaEn x xs = algunos (λy. y = x) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;estaEn x (a # xs) =((a=x) ∨ estaEn x xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((a=x) ∨ algunos (λy. y = x) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;estaEn x (a # xs) = algunos (λy. y = x) (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jospermon1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_1&amp;diff=313</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_1&amp;diff=313"/>
		<updated>2018-02-28T18:10:02Z</updated>

		<summary type="html">&lt;p&gt;Jospermon1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R1: Programación funcional en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory R1_Programacion_funcional_en_Isabelle&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;#039;a list ⇒ nat&lt;br /&gt;
  tal que (longitud xs) es la longitud de la listas xs. Por ejemplo,&lt;br /&gt;
     longitud [a,b,c] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram jescudero cesgongut luicedval rafcabgon diwu2 &lt;br /&gt;
   jospermon1 macmerflo*)&lt;br /&gt;
fun longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud [] = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;longitud (x#xs) = 1 + longitud xs &amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* rafferrod *)&lt;br /&gt;
fun longitud2 :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud2 [] = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;longitud2 x = 1 + longitud2 (tl x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* davperriv *)&lt;br /&gt;
fun longitud3 :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud3 [] = 0&amp;quot;&lt;br /&gt;
| &amp;quot;longitud3 xs = 1 + longitud3 (butlast xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;longitud [a,b,c] = 3&amp;quot;&lt;br /&gt;
value &amp;quot;longitud (x#(y#(z#[])))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&lt;br /&gt;
  tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
  componentes del par p. Por ejemplo,&lt;br /&gt;
     intercambia (u,v) = (v,u)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram cesgongut luicedval rafcabgon diwu2 jescudero&lt;br /&gt;
   rafferrod davperriv macmerflo jospermon1*) &lt;br /&gt;
fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia (x,y) = (y,x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia (u,v) = (v,u)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversa xs) es la lista obtenida invirtiendo el orden de los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     inversa [a,d,c] = [c,d,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid cesgongut rafcabgon diwu2 jescudero jospermon1*)&lt;br /&gt;
fun inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;inversa (x#xs) = inversa xs @[x] &amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anddonram *)&lt;br /&gt;
fun conc1 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc1 [] b = b&amp;quot;&lt;br /&gt;
| &amp;quot;conc1 (x#xs) b = x # conc1 xs b&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc1 [1::int,2] [3] = [1,2,3]&amp;quot;&lt;br /&gt;
value &amp;quot;conc1 [1::int,2] [] = [1,2]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversa2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa2 [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;inversa2 (x#xs) = conc1 (inversa2 xs)  (x#[])&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa2 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* luicedval *)&lt;br /&gt;
fun cuantos :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;cuantos [] = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;cuantos (x#xs) = 1 + cuantos xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun invertir :: &amp;quot;nat  ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;invertir n [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;invertir 0 xs = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;invertir n (x#xs) = invertir (n-1) xs@[x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversa3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa3 [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;inversa3 xs = invertir (cuantos xs) xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa3 [] = []&amp;quot;&lt;br /&gt;
value &amp;quot;inversa3 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* rafferrod davperriv macmerflo *)&lt;br /&gt;
fun inversa4 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa4 [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;inversa4 x = (last x) # (inversa4 (butlast x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     repite :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (repite n x) es la lista formada por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     repite 3 a = [a,a,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram cesgongut luicedval rafcabgon diwu2 rafferrod &lt;br /&gt;
   davperriv macmerflo jospermon1*)&lt;br /&gt;
fun repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite 0 x = []&amp;quot; |&lt;br /&gt;
  &amp;quot;repite n x = x # repite (n-1) x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* jescudero *)&lt;br /&gt;
fun repite2 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite2 0 x = []&amp;quot; |&lt;br /&gt;
  &amp;quot;repite2 (Suc n) x = x # repite2 n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite 3 a = [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     conc :: &amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (conc xs ys) es la concatención de las listas xs e ys. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     conc [a,d] [b,d,a,c] = [a,d,b,d,a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram cesgongut luicedval rafferrod macmerflo jospermon1*)&lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc [] ys = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;conc (x#xs) ys = x # conc xs ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc [a,d] [b,d,a,c] = [a,d,b,d,a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* rafcabgon diwu2 *) &lt;br /&gt;
fun conc2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc2 [] [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;conc2 xs ys = xs @ ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Comentario: El objetivo es mostrar la definición de @ *)&lt;br /&gt;
&lt;br /&gt;
(* jescudero *)&lt;br /&gt;
fun conc3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
    &amp;quot;conc3 [] ys = ys&amp;quot; |&lt;br /&gt;
    &amp;quot;conc3 xs [] = xs&amp;quot; |&lt;br /&gt;
    &amp;quot;conc3 (x#xs) (y#ys) = x # (y #  (conc3 xs ys))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Se puede simplificar. *)&lt;br /&gt;
&lt;br /&gt;
(* davperriv *)&lt;br /&gt;
fun conc4 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc4 [] ys = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;conc4 xs ys = (hd xs) # conc4 (tl xs) ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     coge :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por &lt;br /&gt;
  ejemplo, &lt;br /&gt;
     coge 2 [a,c,d,b,e] = [a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram cesgongut luicedval rafcabgon diwu2 &lt;br /&gt;
   rafferrod macmerflo *)&lt;br /&gt;
fun coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge n [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge 0 xs = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge n (x#xs) = x # coge (n-1) xs &amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* jescudero *)&lt;br /&gt;
fun coge2 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge2 0 xs = []&amp;quot;|&lt;br /&gt;
  &amp;quot;coge2 n [] = []&amp;quot;|&lt;br /&gt;
  &amp;quot;coge2 (Suc n) (x#xs) = x # coge2 n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* davperriv *)&lt;br /&gt;
fun coge3 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge3 0 xs = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge3 n xs = (hd xs) # coge3 (n-1) (tl xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram cesgongut luicedval rafcabgon diwu2 rafferrod&lt;br /&gt;
   jescudero macmerflo jospermon1*) &lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina 0 xs = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina n [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina n (x#xs) = elimina (n-1) xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* davperriv *)&lt;br /&gt;
fun elimina2 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina2 0 xs = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina2 n xs = elimina2 (n-1) (tl xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
     esVacia :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo,&lt;br /&gt;
     esVacia [a] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid jescudero*)&lt;br /&gt;
fun esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia xs = (if xs = [] then True else False)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anddonram diwu2 *)&lt;br /&gt;
fun esVacia2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia2 x = (x=[])&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* cesgongut luicedval rafcabgon rafferrod davperriv macmerflo*)&lt;br /&gt;
fun esVacia3 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia3 [] = True&amp;quot; |&lt;br /&gt;
  &amp;quot;esVacia3 xs = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;esVacia [a] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     inversaAc :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [a,c,b,e] = [e,b,c,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram rafcabgon diwu2 rafferrod davperriv *)&lt;br /&gt;
fun inversaAcAux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux [] ys = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc xs = inversaAcAux xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
fun inversaAcAux2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux2 [] ys = []&amp;quot; |&lt;br /&gt;
  &amp;quot;inversaAcAux2 xs [] = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;inversaAcAux2 (x # xs) ys = inversaAcAux2 xs (x # ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Se puede simplificar. *)&lt;br /&gt;
&lt;br /&gt;
fun inversaAc2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc2 xs = inversaAcAux2 xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc [a,c,b,e] = [e,b,c,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* luicedval *)&lt;br /&gt;
fun elementos :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;elementos [] = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;elementos (x#xs) = 1 + elementos xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAcAux3 :: &amp;quot;nat  ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux3 n [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;inversaAcAux3 0 xs = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;inversaAcAux3 n (x#xs) = inversaAcAux3 (n-1) xs@[x]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
fun inversaAc3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc3 xs = inversaAcAux3 (elementos xs) xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc3 [a,c,b,e] = [e,b,c,a]&amp;quot;&lt;br /&gt;
value &amp;quot;inversaAc3 [] = []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función&lt;br /&gt;
     sum :: nat list ⇒ nat&lt;br /&gt;
  tal que (sum xs) es la suma de los elementos de xs. Por ejemplo,&lt;br /&gt;
     sum [3,2,5] = 10&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid cesgongut luicedval rafcabgon diwu2 rafferrod&lt;br /&gt;
   jescudero macmerflo jospermon1*) &lt;br /&gt;
fun sum :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum [] = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;sum (x#xs) = x+sum xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* davperriv *)&lt;br /&gt;
fun sum2 :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum2 [] = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sum2 xs = (hd xs) + sum2 (tl xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum [3,2,5] = 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función&lt;br /&gt;
     map :: (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&lt;br /&gt;
  tal que (map f xs) es la lista obtenida aplicando la función f a los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     map (λx. 2*x) [3,2,5] = [6,4,10]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid cesgongut luicedval rafcabgon diwu2 rafferrod&lt;br /&gt;
   jescudero macmerflo jospermon1*) &lt;br /&gt;
fun map :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map f [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;map f (x#xs) = f x # (map f xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* davperriv *)&lt;br /&gt;
fun map2 :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map2 f [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;map2 f xs = f (hd xs) # map2 f (tl xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map (λx. x+1) [3::nat,2,4]=[4,3,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jospermon1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_6&amp;diff=270</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_6&amp;diff=270"/>
		<updated>2018-01-17T23:59:26Z</updated>

		<summary type="html">&lt;p&gt;Jospermon1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R7: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R7_Arboles_binarios_completos&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  En esta relación se piden demostraciones automáticas (lo más cortas&lt;br /&gt;
  posibles). Para ello, en algunos casos es necesario incluir lemas&lt;br /&gt;
  auxiliares (que se demuestran automáticamente) y usar ejercicios&lt;br /&gt;
  anteriores. &lt;br /&gt;
&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que no tienen información ni en los nodos y ni en las&lt;br /&gt;
  hojas. Por ejemplo, el árbol&lt;br /&gt;
          ·&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       ·     ·&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H H) (N H H)&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype arbol = H | N arbol arbol&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N (N H H) (N H H) = (N (N H H) (N H H) :: arbol)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (hojas a) es el número de hojas del árbol a. Por ejemplo,&lt;br /&gt;
     hojas (N (N H H) (N H H)) = 4&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 (*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon jescudero cesgongut davperriv rafferrod jospermon1*)&lt;br /&gt;
fun hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;hojas H = 1&amp;quot;&lt;br /&gt;
| &amp;quot;hojas (N x y) =hojas x + hojas y&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (profundidad a) es la profundidad del árbol a. Por ejemplo,&lt;br /&gt;
     profundidad (N (N H H) (N H H)) = 2&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
 (*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon jescudero cesgongut  davperriv rafferrod jospermon1*)&lt;br /&gt;
fun profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad H = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad (N x y) = Suc (max (profundidad x) (profundidad y))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H)) = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     abc :: &amp;quot;nat ⇒ arbol&amp;quot; &lt;br /&gt;
  tal que (abc n) es el árbol binario completo de profundidad n. Por&lt;br /&gt;
  ejemplo,  &lt;br /&gt;
     abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
 (*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon jescudero cesgongut davperriv rafferrod jospermon1*)&lt;br /&gt;
fun abc :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc 0 = H&amp;quot;&lt;br /&gt;
| &amp;quot;abc (Suc n) = N (abc n) (abc n)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Un árbol binario a es completo respecto de la medida f si&lt;br /&gt;
  a es una hoja o bien a es de la forma (N i d) y se cumple que tanto i&lt;br /&gt;
  como d son árboles binarios completos respecto de f y, además, &lt;br /&gt;
  f(i) = f(r).&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&lt;br /&gt;
  tal que (es_abc f a) se verifica si a es un árbol binario completo&lt;br /&gt;
  respecto de f.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
 (*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon jescudero cesgongut  davperriv rafferrod jospermon1*)&lt;br /&gt;
fun es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc f H = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc f (N i d) =((f i = f d) ∧ (es_abc f i) ∧ (es_abc f d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;es_abc profundidad (abc 4) = True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. (size a) es el número de nodos del árbol a. Por ejemplo,&lt;br /&gt;
     size (N (N H H) (N H H)) = 3&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H)) = 3&amp;quot;&lt;br /&gt;
value &amp;quot;size (N (N (N H H) (N H H)) (N (N H H) (N H H))) = 7&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. Tenemos 3 funciones de medida sobre los árboles: número de&lt;br /&gt;
  hojas, número de nodos y profundidad. A cada una le corresponde un&lt;br /&gt;
  concepto de completitud. En los siguientes ejercicios demostraremos&lt;br /&gt;
  que los tres conceptos de completitud son iguales.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de hojas.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon jescudero cesgongut  davperriv jospermon1*)&lt;br /&gt;
(* blast no funciona, ¿cómo eliminar la conjunción sin recurrir a auto? *)&lt;br /&gt;
lemma hojas_prof:&lt;br /&gt;
&amp;quot;es_abc profundidad a ⟶ hojas a = 2^profundidad a&amp;quot;&lt;br /&gt;
  by (induct a) auto&lt;br /&gt;
theorem comp_p_h: &amp;quot;es_abc profundidad a = es_abc hojas a&amp;quot; &lt;br /&gt;
  by (induct a) (auto simp add: hojas_prof)&lt;br /&gt;
&lt;br /&gt;
lemma abc_profundidad_hojas:&lt;br /&gt;
  &amp;quot;es_abc profundidad a ⟶ hojas a = 2 ^ profundidad a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  show &amp;quot;?P H&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix i assume HIi: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N i d)&amp;quot; using HIi HId by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que un árbol binario a es completo respecto del&lt;br /&gt;
  número de hojas syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon jescudero cesgongut  davperriv jospermon1*)&lt;br /&gt;
lemma hojas_size:&lt;br /&gt;
&amp;quot; es_abc hojas a ⟶ hojas a = Suc (size a)&amp;quot;&lt;br /&gt;
  by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
 theorem comp_h_s: &amp;quot;es_abc hojas a = es_abc size a&amp;quot; &lt;br /&gt;
  by (induct a) (auto simp add: hojas_size )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon*)&lt;br /&gt;
 theorem &amp;quot;es_abc profundidad a = es_abc size a&amp;quot; &lt;br /&gt;
  by (simp_all add:comp_p_h comp_h_s)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que (abc n) es un árbol binario completo.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon rafferrod*)&lt;br /&gt;
  theorem &amp;quot;es_abc f (abc n) &amp;quot; &lt;br /&gt;
  by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
theorem &amp;quot;es_abc f (abc n)&amp;quot; (is &amp;quot;?P n&amp;quot;)&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;?P 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a assume HI: &amp;quot;?P a&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (Suc a)&amp;quot; using HI by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es igual a&lt;br /&gt;
  (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval oscgonesc macmerflo diwu2 rafcabgon*)&lt;br /&gt;
 theorem &amp;quot;es_abc profundidad a =(a=abc (profundidad a)) &amp;quot; &lt;br /&gt;
  by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
lemma  &lt;br /&gt;
  assumes &amp;quot;es_abc profundidad a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;a = (abc (profundidad a))&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
theorem &amp;quot;es_abc profundidad a ⟶ a = (abc (profundidad a))&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  show &amp;quot;?P H&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix i assume HIi: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N i d)&amp;quot; using HIi HId by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Encontrar una medida f tal que (es_abc f) es distinto de &lt;br /&gt;
  (es_abc size).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram(mas o menos llegué a la conclusión de que f(H)=f(N i d) )  luicedval edupalhid rafcabgon cesgongut  davperriv *)&lt;br /&gt;
fun funcion :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;funcion H = 1&amp;quot;&lt;br /&gt;
| &amp;quot;funcion (N x y) =  funcion x &amp;quot;&lt;br /&gt;
&lt;br /&gt;
 theorem &amp;quot;es_abc size a = es_abc funcion a&amp;quot; &lt;br /&gt;
   quickcheck&lt;br /&gt;
   oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jospermon1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_6&amp;diff=269</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_6&amp;diff=269"/>
		<updated>2018-01-17T23:58:57Z</updated>

		<summary type="html">&lt;p&gt;Jospermon1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R7: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R7_Arboles_binarios_completos&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  En esta relación se piden demostraciones automáticas (lo más cortas&lt;br /&gt;
  posibles). Para ello, en algunos casos es necesario incluir lemas&lt;br /&gt;
  auxiliares (que se demuestran automáticamente) y usar ejercicios&lt;br /&gt;
  anteriores. &lt;br /&gt;
&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que no tienen información ni en los nodos y ni en las&lt;br /&gt;
  hojas. Por ejemplo, el árbol&lt;br /&gt;
          ·&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       ·     ·&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H H) (N H H)&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype arbol = H | N arbol arbol&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N (N H H) (N H H) = (N (N H H) (N H H) :: arbol)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (hojas a) es el número de hojas del árbol a. Por ejemplo,&lt;br /&gt;
     hojas (N (N H H) (N H H)) = 4&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 (*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon jescudero cesgongut davperriv rafferrod*)&lt;br /&gt;
fun hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;hojas H = 1&amp;quot;&lt;br /&gt;
| &amp;quot;hojas (N x y) =hojas x + hojas y&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (profundidad a) es la profundidad del árbol a. Por ejemplo,&lt;br /&gt;
     profundidad (N (N H H) (N H H)) = 2&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
 (*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon jescudero cesgongut  davperriv rafferrod jospermon1*)&lt;br /&gt;
fun profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad H = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad (N x y) = Suc (max (profundidad x) (profundidad y))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H)) = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     abc :: &amp;quot;nat ⇒ arbol&amp;quot; &lt;br /&gt;
  tal que (abc n) es el árbol binario completo de profundidad n. Por&lt;br /&gt;
  ejemplo,  &lt;br /&gt;
     abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
 (*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon jescudero cesgongut davperriv rafferrod jospermon1*)&lt;br /&gt;
fun abc :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc 0 = H&amp;quot;&lt;br /&gt;
| &amp;quot;abc (Suc n) = N (abc n) (abc n)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Un árbol binario a es completo respecto de la medida f si&lt;br /&gt;
  a es una hoja o bien a es de la forma (N i d) y se cumple que tanto i&lt;br /&gt;
  como d son árboles binarios completos respecto de f y, además, &lt;br /&gt;
  f(i) = f(r).&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&lt;br /&gt;
  tal que (es_abc f a) se verifica si a es un árbol binario completo&lt;br /&gt;
  respecto de f.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
 (*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon jescudero cesgongut  davperriv rafferrod jospermon1*)&lt;br /&gt;
fun es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc f H = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc f (N i d) =((f i = f d) ∧ (es_abc f i) ∧ (es_abc f d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;es_abc profundidad (abc 4) = True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. (size a) es el número de nodos del árbol a. Por ejemplo,&lt;br /&gt;
     size (N (N H H) (N H H)) = 3&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H)) = 3&amp;quot;&lt;br /&gt;
value &amp;quot;size (N (N (N H H) (N H H)) (N (N H H) (N H H))) = 7&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. Tenemos 3 funciones de medida sobre los árboles: número de&lt;br /&gt;
  hojas, número de nodos y profundidad. A cada una le corresponde un&lt;br /&gt;
  concepto de completitud. En los siguientes ejercicios demostraremos&lt;br /&gt;
  que los tres conceptos de completitud son iguales.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de hojas.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon jescudero cesgongut  davperriv jospermon1*)&lt;br /&gt;
(* blast no funciona, ¿cómo eliminar la conjunción sin recurrir a auto? *)&lt;br /&gt;
lemma hojas_prof:&lt;br /&gt;
&amp;quot;es_abc profundidad a ⟶ hojas a = 2^profundidad a&amp;quot;&lt;br /&gt;
  by (induct a) auto&lt;br /&gt;
theorem comp_p_h: &amp;quot;es_abc profundidad a = es_abc hojas a&amp;quot; &lt;br /&gt;
  by (induct a) (auto simp add: hojas_prof)&lt;br /&gt;
&lt;br /&gt;
lemma abc_profundidad_hojas:&lt;br /&gt;
  &amp;quot;es_abc profundidad a ⟶ hojas a = 2 ^ profundidad a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  show &amp;quot;?P H&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix i assume HIi: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N i d)&amp;quot; using HIi HId by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que un árbol binario a es completo respecto del&lt;br /&gt;
  número de hojas syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon jescudero cesgongut  davperriv jospermon1*)&lt;br /&gt;
lemma hojas_size:&lt;br /&gt;
&amp;quot; es_abc hojas a ⟶ hojas a = Suc (size a)&amp;quot;&lt;br /&gt;
  by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
 theorem comp_h_s: &amp;quot;es_abc hojas a = es_abc size a&amp;quot; &lt;br /&gt;
  by (induct a) (auto simp add: hojas_size )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon*)&lt;br /&gt;
 theorem &amp;quot;es_abc profundidad a = es_abc size a&amp;quot; &lt;br /&gt;
  by (simp_all add:comp_p_h comp_h_s)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que (abc n) es un árbol binario completo.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval oscgonesc edupalhid macmerflo diwu2 rafcabgon rafferrod*)&lt;br /&gt;
  theorem &amp;quot;es_abc f (abc n) &amp;quot; &lt;br /&gt;
  by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
theorem &amp;quot;es_abc f (abc n)&amp;quot; (is &amp;quot;?P n&amp;quot;)&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;?P 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a assume HI: &amp;quot;?P a&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (Suc a)&amp;quot; using HI by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es igual a&lt;br /&gt;
  (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram luicedval oscgonesc macmerflo diwu2 rafcabgon*)&lt;br /&gt;
 theorem &amp;quot;es_abc profundidad a =(a=abc (profundidad a)) &amp;quot; &lt;br /&gt;
  by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
lemma  &lt;br /&gt;
  assumes &amp;quot;es_abc profundidad a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;a = (abc (profundidad a))&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
theorem &amp;quot;es_abc profundidad a ⟶ a = (abc (profundidad a))&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  show &amp;quot;?P H&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix i assume HIi: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N i d)&amp;quot; using HIi HId by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Encontrar una medida f tal que (es_abc f) es distinto de &lt;br /&gt;
  (es_abc size).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*anddonram(mas o menos llegué a la conclusión de que f(H)=f(N i d) )  luicedval edupalhid rafcabgon cesgongut  davperriv *)&lt;br /&gt;
fun funcion :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;funcion H = 1&amp;quot;&lt;br /&gt;
| &amp;quot;funcion (N x y) =  funcion x &amp;quot;&lt;br /&gt;
&lt;br /&gt;
 theorem &amp;quot;es_abc size a = es_abc funcion a&amp;quot; &lt;br /&gt;
   quickcheck&lt;br /&gt;
   oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jospermon1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_3&amp;diff=156</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_3&amp;diff=156"/>
		<updated>2017-11-30T07:23:05Z</updated>

		<summary type="html">&lt;p&gt;Jospermon1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R3: Razonamiento sobre programas *}&lt;br /&gt;
&lt;br /&gt;
theory R3_Razonamiento_sobre_programas&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1.1. Definir la función&lt;br /&gt;
     sumaImpares :: nat ⇒ nat&lt;br /&gt;
  tal que (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 5  =  25&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0 = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sumaImpares (Suc n) = sumaImpares n + (2*n+1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1.2. Escribir la demostración detallada de &lt;br /&gt;
     sumaImpares n = n*n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
(* anddonram edupalhid rafcabgon luicedval jescudero macmerflo diwu2&lt;br /&gt;
   rafferrod cesgongut jospermon1 *) &lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaImpares 0 = 0*0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaImpares n=n*n&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaImpares (Suc n) = sumaImpares n + (2*n+1)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = n*n + (2*n+1)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;sumaImpares (Suc n) =(Suc n) *(Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot;&lt;br /&gt;
| &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
      sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.2. Escribir la demostración detallada de &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid luicedval macmerflo jescudero diwu2 rafferrod jospermon1 *)&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
        sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 2^(n+1) +  2^(n+1)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = 2^((n+1)+1)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^(Suc n + 1)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
(* rafcabgon cesgongut *)&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
        sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 2^(n+1) + 2^(n+1)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = 2^((Suc n) + 1)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2 ^ (Suc n + 1)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia 0 x       = []&amp;quot;&lt;br /&gt;
| &amp;quot;copia (Suc n) x = x # copia n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar detalladamente que todos los elementos de&lt;br /&gt;
  (copia n x) son iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid rafcabgon luicedval macmerflo jescudero diwu2 jospermon1 *)&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;todos (λy. y=x) (copia 0 x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λy. y=x) (copia (Suc n) x) =&lt;br /&gt;
        todos (λy. y=x) (x#(copia n x))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... =  todos (λy. y=x) (copia n x) &amp;quot; by simp&lt;br /&gt;
  show &amp;quot;todos (λy. y=x) (copia (Suc n) x)&amp;quot;  using HI by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* rafferrod *)&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;todos (λy. y=x) (copia 0 x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λy. y=x) (copia (Suc n) x) = &lt;br /&gt;
        todos (λy. y=x) (x#(copia n x))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (((λy. y=x) x) ∧ (todos (λy. y=x) (copia n x)))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λy. y=x) (copia (Suc n) x)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.1. Definir la función&lt;br /&gt;
    factR :: nat ⇒ nat&lt;br /&gt;
  tal que (factR n) es el factorial de n. Por ejemplo,&lt;br /&gt;
    factR 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun factR :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factR 0       = 1&amp;quot;&lt;br /&gt;
| &amp;quot;factR (Suc n) = Suc n * factR n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.2. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
     &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
  Demostrar que, para todo n y todo x, se tiene &lt;br /&gt;
     factI&amp;#039; n x = x * factR n&lt;br /&gt;
  Indicación: La propiedad mult_Suc es &lt;br /&gt;
     (Suc m) * n = n + m * n&lt;br /&gt;
  Puede que se necesite desactivarla en un paso con &lt;br /&gt;
     (simp del: mult_Suc)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; 0       x = x&amp;quot;&lt;br /&gt;
| &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x * Suc n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = factI&amp;#039; n 1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anddonram rafferrod *)&lt;br /&gt;
lemma fact: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
proof (induct n arbitrary: x)&lt;br /&gt;
  show &amp;quot;⋀x. factI&amp;#039; 0 x = x * factR 0&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;⋀x. factI&amp;#039; n x = x * factR n&amp;quot; &lt;br /&gt;
  fix x&lt;br /&gt;
  have &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x * Suc n)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (x * Suc n) * factR n&amp;quot; using HI by simp &lt;br /&gt;
  also have &amp;quot;... = x * (Suc n * factR n)&amp;quot; by (simp del:mult_Suc)&lt;br /&gt;
  finally show &amp;quot;factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* edupalhid rafcabgon luicedval macmerflo diwu2 jescudero jospermon1 *)&lt;br /&gt;
lemma fact&amp;#039;: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
proof (induct n arbitrary: x)&lt;br /&gt;
  show &amp;quot;⋀x. factI&amp;#039; 0 x = x * factR 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;⋀x. factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x * Suc n)&amp;quot;   by simp&lt;br /&gt;
    also have &amp;quot;... = (x * Suc n) * factR n&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = x * (Suc n * factR n)&amp;quot; by (simp del: mult_Suc)&lt;br /&gt;
    also have &amp;quot;... = x * factR (Suc n)&amp;quot; by simp&lt;br /&gt;
    finally show &amp;quot;factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot; by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.3. Escribir la demostración detallada de&lt;br /&gt;
     factI n = factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid rafcabgon luicedval macmerflo diwu2 jescudero &lt;br /&gt;
   rafferrod jospermon1 *)&lt;br /&gt;
corollary &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  fix n&lt;br /&gt;
  have &amp;quot;factI n = factI&amp;#039; n 1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 1 * factR n&amp;quot; by (simp add:fact)&lt;br /&gt;
  finally show &amp;quot;factI n = factR n&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.1. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia []     y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.2. Escribir la demostración detallada de&lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* anddonram rafcabgon luicedval macmerflo diwu2 jescudero rafferrod jospermon1 *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;amplia [] y = [] @ [y]&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (a#xs) y =a # amplia xs y&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a # (xs @[y]) &amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... =(a # xs) @[y] &amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;amplia (a#xs) y= (a # xs) @[y]&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* edupalhid *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (x # xs) y = x # amplia xs y&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (x # xs) @ [y]&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jospermon1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_1&amp;diff=70</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2017/index.php?title=Relaci%C3%B3n_1&amp;diff=70"/>
		<updated>2017-11-02T10:46:43Z</updated>

		<summary type="html">&lt;p&gt;Jospermon1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R1: Programación funcional en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory R1_Programacion_funcional_en_Isabelle&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;#039;a list ⇒ nat&lt;br /&gt;
  tal que (longitud xs) es la longitud de la listas xs. Por ejemplo,&lt;br /&gt;
     longitud [a,b,c] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram jescudero cesgongut luicedval rafcabgon diwu2 davperriv jospermon1*)&lt;br /&gt;
fun longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud [] = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;longitud (x#xs) = 1 + longitud xs &amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* rafferrod *)&lt;br /&gt;
fun longitud2 :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud2 [] = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;longitud2 x = 1 + longitud2 (tl x)&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
value &amp;quot;longitud [a,b,c] = 3&amp;quot;&lt;br /&gt;
value &amp;quot;longitud (x#(y#(z#[])))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&lt;br /&gt;
  tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
  componentes del par p. Por ejemplo,&lt;br /&gt;
     intercambia (u,v) = (v,u)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram cesgongut luicedval rafcabgon diwu2 jescudero&lt;br /&gt;
   rafferrod davperriv*) &lt;br /&gt;
fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia (x,y) = (y,x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia (u,v) = (v,u)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversa xs) es la lista obtenida invirtiendo el orden de los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     inversa [a,d,c] = [c,d,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid cesgongut rafcabgon diwu2 jescudero*)&lt;br /&gt;
fun inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;inversa (x#xs) = inversa xs @[x] &amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anddonram *)&lt;br /&gt;
fun conc1 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc1 [] b = b&amp;quot;&lt;br /&gt;
| &amp;quot;conc1 (x#xs) b = x # conc1 xs b&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc1 [1::int,2] [3] = [1,2,3]&amp;quot;&lt;br /&gt;
value &amp;quot;conc1 [1::int,2] [] = [1,2]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversa2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa2 [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;inversa2 (x#xs) = conc1 (inversa2 xs)  (x#[])&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa2 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* luicedval *)&lt;br /&gt;
fun cuantos :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;cuantos [] = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;cuantos (x#xs) = 1 + cuantos xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun invertir :: &amp;quot;nat  ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;invertir n [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;invertir 0 xs = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;invertir n (x#xs) = invertir (n-1) xs@[x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversa3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa3 [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;inversa3 xs = invertir (cuantos xs) xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa3 [] = []&amp;quot;&lt;br /&gt;
value &amp;quot;inversa3 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* rafferrod *)&lt;br /&gt;
fun inversa4 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa4 [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;inversa4 x = (last x) # (inversa4 (butlast x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     repite :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (repite n x) es la lista formada por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     repite 3 a = [a,a,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram cesgongut luicedval rafcabgon diwu2 rafferrod *)&lt;br /&gt;
fun repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite 0 x = []&amp;quot; |&lt;br /&gt;
  &amp;quot;repite n x = x # repite (n-1) x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* jescudero *)&lt;br /&gt;
fun repite2 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite2 0 x = []&amp;quot; |&lt;br /&gt;
  &amp;quot;repite2 (Suc n) x = x # repite2 n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite 3 a = [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     conc :: &amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (conc xs ys) es la concatención de las listas xs e ys. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     conc [a,d] [b,d,a,c] = [a,d,b,d,a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram cesgongut luicedval rafferrod *)&lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc [] ys = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;conc (x#xs) ys = x # conc xs ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc [a,d] [b,d,a,c] = [a,d,b,d,a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* rafcabgon diwu2 *) &lt;br /&gt;
fun conc2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc2 [] [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;conc2 xs ys = xs @ ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Comentario: El objetivo es mostrar la definición de @ *)&lt;br /&gt;
&lt;br /&gt;
(* jescudero *)&lt;br /&gt;
fun conc3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
    &amp;quot;conc3 [] ys = ys&amp;quot; |&lt;br /&gt;
    &amp;quot;conc3 xs [] = xs&amp;quot; |&lt;br /&gt;
    &amp;quot;conc3 (x#xs) (y#ys) = x # (y #  (conc3 xs ys))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Se puede simplificar. *)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     coge :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por &lt;br /&gt;
  ejemplo, &lt;br /&gt;
     coge 2 [a,c,d,b,e] = [a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram cesgongut luicedval rafcabgon diwu2 rafferrod *)&lt;br /&gt;
fun coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge n [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge 0 xs = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge n (x#xs) = x # coge (n-1) xs &amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* jescudero *)&lt;br /&gt;
fun coge2 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge2 0 xs = []&amp;quot;|&lt;br /&gt;
  &amp;quot;coge2 n [] = []&amp;quot;|&lt;br /&gt;
  &amp;quot;coge2 (Suc n) (x#xs) = x # coge2 n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram cesgongut luicedval rafcabgon diwu2 rafferrod&lt;br /&gt;
   jescudero*) &lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina 0 xs = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina n [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina n (x#xs) = elimina (n-1) xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
     esVacia :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo,&lt;br /&gt;
     esVacia [a] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid jescudero*)&lt;br /&gt;
fun esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia xs = (if xs = [] then True else False)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anddonram diwu2 *)&lt;br /&gt;
fun esVacia2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia2 x = (x=[])&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* cesgongut luicedval rafcabgon rafferrod *)&lt;br /&gt;
fun esVacia3 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia3 [] = True&amp;quot; |&lt;br /&gt;
  &amp;quot;esVacia3 xs = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;esVacia [a] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     inversaAc :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [a,c,b,e] = [e,b,c,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* edupalhid anddonram rafcabgon diwu2 rafferrod *)&lt;br /&gt;
fun inversaAcAux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux [] ys = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc xs = inversaAcAux xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* cesgongut *)&lt;br /&gt;
fun inversaAcAux2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux2 [] ys = []&amp;quot; |&lt;br /&gt;
  &amp;quot;inversaAcAux2 xs [] = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;inversaAcAux2 (x # xs) ys = inversaAcAux2 xs (x # ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Se puede simplificar. *)&lt;br /&gt;
&lt;br /&gt;
fun inversaAc2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc2 xs = inversaAcAux2 xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc [a,c,b,e] = [e,b,c,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* luicedval *)&lt;br /&gt;
fun elementos :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;elementos [] = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;elementos (x#xs) = 1 + elementos xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAcAux3 :: &amp;quot;nat  ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux3 n [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;inversaAcAux3 0 xs = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;inversaAcAux3 n (x#xs) = inversaAcAux3 (n-1) xs@[x]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
fun inversaAc3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc3 xs = inversaAcAux3 (elementos xs) xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc3 [a,c,b,e] = [e,b,c,a]&amp;quot;&lt;br /&gt;
value &amp;quot;inversaAc3 [] = []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función&lt;br /&gt;
     sum :: nat list ⇒ nat&lt;br /&gt;
  tal que (sum xs) es la suma de los elementos de xs. Por ejemplo,&lt;br /&gt;
     sum [3,2,5] = 10&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid cesgongut luicedval rafcabgon diwu2 rafferrod&lt;br /&gt;
   jescudero*) &lt;br /&gt;
fun sum :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum [] = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;sum (x#xs) = x+sum xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum [3,2,5] = 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función&lt;br /&gt;
     map :: (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&lt;br /&gt;
  tal que (map f xs) es la lista obtenida aplicando la función f a los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     map (λx. 2*x) [3,2,5] = [6,4,10]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* anddonram edupalhid cesgongut luicedval rafcabgon diwu2 rafferrod&lt;br /&gt;
   jescudero*) &lt;br /&gt;
fun map :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map f [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;map f (x#xs) = f x # (map f xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map (λx. x+1) [3::nat,2,4]=[4,3,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jospermon1</name></author>
		
	</entry>
</feed>