<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?action=history&amp;feed=atom&amp;title=Rel_13_%28sol%29</id>
	<title>Rel 13 (sol) - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?action=history&amp;feed=atom&amp;title=Rel_13_%28sol%29"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Rel_13_(sol)&amp;action=history"/>
	<updated>2026-09-20T04:05:33Z</updated>
	<subtitle>Historial de revisiones para esta página en el wiki</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Rel_13_(sol)&amp;diff=1212&amp;oldid=prev</id>
		<title>Mjoseh: Protegió «Rel 13 (sol)» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Rel_13_(sol)&amp;diff=1212&amp;oldid=prev"/>
		<updated>2020-05-21T09:54:59Z</updated>

		<summary type="html">&lt;p&gt;Protegió «&lt;a href=&quot;/~jalonso/LMF2020/index.php/Rel_13_(sol)&quot; title=&quot;Rel 13 (sol)&quot;&gt;Rel 13 (sol)&lt;/a&gt;» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revisión del 09:54 21 may 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;es&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Sin diferencias)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Rel_13_(sol)&amp;diff=1211&amp;oldid=prev</id>
		<title>Mjoseh: Página creada con «&lt;source lang = &quot;isabelle&quot;&gt; chapter ‹R13: Recorridos de árboles›  theory R13_sol imports Main  begin   text ‹---------------------------------------------------------…»</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Rel_13_(sol)&amp;diff=1211&amp;oldid=prev"/>
		<updated>2020-05-21T09:54:48Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt; chapter ‹R13: Recorridos de árboles›  theory R13_sol imports Main  begin   text ‹---------------------------------------------------------…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter ‹R13: Recorridos de árboles›&lt;br /&gt;
&lt;br /&gt;
theory R13_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &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;
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;
  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;
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;
  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;
     = [a,d,c,f,h,g,e] &lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&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;
  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;
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;
  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;
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;
  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;
― ‹La demostración en lenguaje natural es&lt;br /&gt;
Por inducción en la estructura de a, hay que probar:&lt;br /&gt;
&lt;br /&gt;
+ Caso base: a es una hoja, es decir, a = H x&lt;br /&gt;
   En este caso,&lt;br /&gt;
      preOrden (espejo (H x))&lt;br /&gt;
   =  preOrden (H x)               (def. de espejo)&lt;br /&gt;
   =  [x]                          (def. de preOrden)&lt;br /&gt;
   Por otra parte,&lt;br /&gt;
      rev (postOrden (H x))&lt;br /&gt;
   =  rev [x]                      (def. de postOrden)&lt;br /&gt;
   =  [] @ [x]                     (def. de rev)&lt;br /&gt;
   =  [x]                          (def. de append)&lt;br /&gt;
&lt;br /&gt;
   Por tanto,  preOrden (espejo (H x)) = rev (postOrden (H x))&lt;br /&gt;
&lt;br /&gt;
+ Paso inductivo: a = (N x i d) y se verifica la hipótesis de &lt;br /&gt;
  para los árboles i y d. Es decir,&lt;br /&gt;
  H1:  preOrden (espejo i) = rev (postOrden i)&lt;br /&gt;
  H2:  preOrden (espejo d) = rev (postOrden d)&lt;br /&gt;
&lt;br /&gt;
  Hay que probar:  preOrden (espejo a) = rev (postOrden a)&lt;br /&gt;
&lt;br /&gt;
  En efecto,&lt;br /&gt;
    preOrden (espejo (N x i d)) &lt;br /&gt;
  = preOrden (N x (espejo d) (espejo i))             (def. espejo)&lt;br /&gt;
  = x # (preOrden (espejo d) @ preOrden (espejo i))  (def. preOrden)&lt;br /&gt;
  = x # (rev (postOrden d) @ rev (postOrden i))      (por H1 y H2)&lt;br /&gt;
  = x # rev ((postOrden i) @ (postOrden d))          (prop. de rev y append)&lt;br /&gt;
  = rev ((postOrden i) @ (postOrden d) @ [x])        (prop. de rev y append)&lt;br /&gt;
  = rev (postOrden (N x i d))                        (def. postOrden)&lt;br /&gt;
&lt;br /&gt;
  Por tanto,  preOrden (espejo a) = rev (postOrden a)&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática es›&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;
― ‹La demostración estructurada es›&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 i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &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;… = x # (preOrden (espejo d) @ preOrden (espejo i))&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = x # (rev (postOrden d) @ rev (postOrden i))&amp;quot; &lt;br /&gt;
      using HI1 HI2 by simp &lt;br /&gt;
    also have &amp;quot;… = x # rev (postOrden i @ postOrden d)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev ((postOrden i) @ (postOrden d) @ [x])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev (postOrden (N x i d))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración declarativa detallada es›&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;#039;a&lt;br /&gt;
  have &amp;quot;preOrden (espejo (H x)) = preOrden (H x)&amp;quot;&lt;br /&gt;
    by (simp only: espejo.simps(1))&lt;br /&gt;
  also have &amp;quot;… = [x]&amp;quot;&lt;br /&gt;
    by (simp only: preOrden.simps(1))&lt;br /&gt;
  also have &amp;quot;… = rev [x]&amp;quot;&lt;br /&gt;
    by (simp only: rev.simps&lt;br /&gt;
                   append.simps(1))&lt;br /&gt;
  also have &amp;quot;… = rev (postOrden (H x))&amp;quot;&lt;br /&gt;
    by (simp only: postOrden.simps(1))&lt;br /&gt;
  finally show &amp;quot;preOrden (espejo (H x)) = rev (postOrden (H x))&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &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; &lt;br /&gt;
      by (simp only: espejo.simps(2))&lt;br /&gt;
    also have &amp;quot;… = x # (preOrden (espejo d) @ preOrden (espejo i))&amp;quot; &lt;br /&gt;
      by (simp only: preOrden.simps(2))&lt;br /&gt;
    also have &amp;quot;… = x # (rev (postOrden d) @ rev (postOrden i))&amp;quot; &lt;br /&gt;
      by (simp only: HI1 HI2) &lt;br /&gt;
    also have &amp;quot;… = x # rev (postOrden i @ postOrden d)&amp;quot; &lt;br /&gt;
      by (simp only: rev_append)&lt;br /&gt;
    also have &amp;quot;… = rev ((postOrden i) @ (postOrden d) @ [x])&amp;quot;&lt;br /&gt;
      by (simp only: rev_append append.simps rev.simps)&lt;br /&gt;
    also have &amp;quot;… = rev (postOrden (N x i d))&amp;quot; &lt;br /&gt;
      by (simp only: postOrden.simps(2))&lt;br /&gt;
    finally show ?thesis &lt;br /&gt;
      by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración aplicativa detallada es›&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot; &lt;br /&gt;
  apply (induct a)&lt;br /&gt;
   apply (simp only: espejo.simps(1)&lt;br /&gt;
                     postOrden.simps(1)&lt;br /&gt;
                     preOrden.simps(1)&lt;br /&gt;
                     rev.simps)&lt;br /&gt;
   apply (simp only: append.simps(1))&lt;br /&gt;
   apply (simp only: espejo.simps(2)&lt;br /&gt;
                     postOrden.simps(2)&lt;br /&gt;
                     preOrden.simps(2))&lt;br /&gt;
  apply  (simp only: rev_append &lt;br /&gt;
                     append.simps &lt;br /&gt;
                     rev.simps)&lt;br /&gt;
  done    &lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &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;
― ‹La demostración automática es›&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;
― ‹La demostración estructurada es›&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&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;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &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;postOrden (espejo (N x i d)) = &lt;br /&gt;
          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; &lt;br /&gt;
       using HI1 HI2 by simp&lt;br /&gt;
    also have &amp;quot;… = rev (preOrden i @ preOrden d) @ [x]&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev ([x] @ preOrden i @ preOrden d)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev (preOrden (N x i d))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* Auxiliar *)&lt;br /&gt;
lemma rev1: &amp;quot;rev [x] = [x]&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have &amp;quot;rev [x] = (rev []) @ [x]&amp;quot; by (simp only:rev.simps)&lt;br /&gt;
  also have &amp;quot;… = [] @ [x]&amp;quot; by (simp only: rev.simps)&lt;br /&gt;
  also have &amp;quot;… = [x]&amp;quot; by (simp only: append_Nil)&lt;br /&gt;
  finally show &amp;quot;rev [x] = [x]&amp;quot; by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración declarativa detallada es›&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&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by (simp only: espejo.simps(1)&lt;br /&gt;
                                 postOrden.simps(1)&lt;br /&gt;
                                 preOrden.simps(1)&lt;br /&gt;
                                 rev.simps&lt;br /&gt;
                                 append.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &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;postOrden (espejo (N x i d)) = &lt;br /&gt;
          postOrden (N x (espejo d) (espejo i))&amp;quot; &lt;br /&gt;
          by (simp only:espejo.simps(2))&lt;br /&gt;
        also have &amp;quot;… = postOrden (espejo d) @ postOrden (espejo i) @ [x]&amp;quot; &lt;br /&gt;
            by (simp only: postOrden.simps(2))&lt;br /&gt;
    also have &amp;quot;… = rev (preOrden d) @ rev (preOrden i) @ [x]&amp;quot; &lt;br /&gt;
      by (simp only: HI1 HI2) &lt;br /&gt;
    also have &amp;quot;… = rev (preOrden i @ preOrden d) @ [x]&amp;quot; &lt;br /&gt;
      by (simp only: rev_append append_assoc)&lt;br /&gt;
    also have &amp;quot;… = rev (preOrden i @ preOrden d) @ rev [x]&amp;quot; &lt;br /&gt;
      by (simp only: rev1)&lt;br /&gt;
      also have &amp;quot;… = rev ([x] @ preOrden i @ preOrden d)&amp;quot; &lt;br /&gt;
       by (simp only: rev_append)&lt;br /&gt;
      also have &amp;quot;… = rev (preOrden (N x i d))&amp;quot; &lt;br /&gt;
        by (simp only: append.simps preOrden.simps(2))&lt;br /&gt;
    finally show ?thesis by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración aplicativa detallada es›&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
  apply (induct a)&lt;br /&gt;
  apply (simp only: espejo.simps(1)&lt;br /&gt;
                     postOrden.simps(1)&lt;br /&gt;
                     preOrden.simps(1)&lt;br /&gt;
                     rev.simps)&lt;br /&gt;
   apply (simp only: append.simps(1))&lt;br /&gt;
     apply (simp only: espejo.simps(2)&lt;br /&gt;
                     postOrden.simps(2)&lt;br /&gt;
                     preOrden.simps(2))&lt;br /&gt;
  apply  (simp only: rev_append &lt;br /&gt;
                     append.simps &lt;br /&gt;
                     rev.simps)&lt;br /&gt;
  apply (simp only: append.assoc)&lt;br /&gt;
  done&lt;br /&gt;
  &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;
― ‹La demostración automática es›&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;
― ‹La demostración estructurada es›&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&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;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &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;inOrden (espejo (N x i d)) = &lt;br /&gt;
          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; &lt;br /&gt;
       using HI1 HI2 by simp&lt;br /&gt;
    also have &amp;quot;… = rev (inOrden i @ [x] @ inOrden d)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev (inOrden (N x i d))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración declarativa detallada es›&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&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by (simp only: espejo.simps(1)&lt;br /&gt;
                     inOrden.simps(1)&lt;br /&gt;
                     rev.simps&lt;br /&gt;
                     append_Nil)&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &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;inOrden (espejo (N x i d)) = &lt;br /&gt;
          inOrden (N x (espejo d) (espejo i))&amp;quot; &lt;br /&gt;
      by (simp only: espejo.simps(2))&lt;br /&gt;
    also have &amp;quot;… = inOrden (espejo d) @ [x] @ inOrden (espejo i)&amp;quot; &lt;br /&gt;
      by (simp only: inOrden.simps(2))&lt;br /&gt;
    also have &amp;quot;… = rev (inOrden d) @ [x] @ rev (inOrden i)&amp;quot; &lt;br /&gt;
      by (simp only: HI1 HI2)&lt;br /&gt;
    also have &amp;quot;… = rev (inOrden i @ [x] @ inOrden d)&amp;quot; &lt;br /&gt;
      by (simp only: rev1 rev_append append_assoc)&lt;br /&gt;
    also have &amp;quot;… = rev (inOrden (N x i d))&amp;quot; &lt;br /&gt;
      by (simp only: inOrden.simps(2))&lt;br /&gt;
    finally show ?thesis by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración aplicativa detallada es›&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
  apply (induct a)&lt;br /&gt;
  apply (simp only: espejo.simps(1)&lt;br /&gt;
                     inOrden.simps(1)&lt;br /&gt;
                     rev.simps)&lt;br /&gt;
   apply (simp only: append_Nil)&lt;br /&gt;
   apply (simp only: espejo.simps(2)&lt;br /&gt;
                     inOrden.simps(2)&lt;br /&gt;
                     rev.simps)&lt;br /&gt;
  apply (simp only: rev_append &lt;br /&gt;
                    append.assoc &lt;br /&gt;
                    rev1)&lt;br /&gt;
  done&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;
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)))&amp;quot; ― ‹= e›&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;
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;
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;
― ‹La demostración automática, basada en un lema, es›&lt;br /&gt;
lemma inOrdenNoVacio: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: inOrdenNoVacio)&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración estructurada es›&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&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;
  assume HI: &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;last (inOrden (N x i d)) = &lt;br /&gt;
          last (inOrden i @ [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 HI by simp&lt;br /&gt;
    also have &amp;quot;… =  extremo_derecha (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración declarativa detallada es›&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&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by (simp only: inOrden.simps(1)&lt;br /&gt;
                    extremo_derecha.simps(1)&lt;br /&gt;
                    last.simps&lt;br /&gt;
                    if_P)&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI: &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;last (inOrden (N x i d)) = &lt;br /&gt;
          last (inOrden i @ [x] @ inOrden d)&amp;quot; &lt;br /&gt;
      by (simp only: inOrden.simps)&lt;br /&gt;
    also have &amp;quot;… = last (inOrden d)&amp;quot; &lt;br /&gt;
      by (simp add:inOrdenNoVacio)&lt;br /&gt;
    also have &amp;quot;… = extremo_derecha d&amp;quot; using HI by this&lt;br /&gt;
    also have &amp;quot;… =  extremo_derecha (N x i d)&amp;quot; &lt;br /&gt;
      by (simp only: extremo_derecha.simps(2))&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración aplicativa detallada es›&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
  apply (induct a)&lt;br /&gt;
  apply (simp only: inOrden.simps(1)&lt;br /&gt;
                    extremo_derecha.simps(1)&lt;br /&gt;
                    last.simps&lt;br /&gt;
                    if_P)&lt;br /&gt;
  apply (simp only: inOrden.simps(2)&lt;br /&gt;
                    extremo_derecha.simps(2))&lt;br /&gt;
  apply (simp only: last_append)&lt;br /&gt;
  apply (split if_split)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (simp only:append_Cons &lt;br /&gt;
                    append_Nil) &lt;br /&gt;
   apply (simp only: list.simps)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
   apply (split if_split)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (simp only: inOrdenNoVacio)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (simp only: refl)&lt;br /&gt;
  done&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;
― ‹La demostración automática es›&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: inOrdenNoVacio)&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración estructurada es›&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&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;
  assume HI: &amp;quot;?P i&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;hd (inOrden (N x i d)) = &lt;br /&gt;
          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 HI by simp&lt;br /&gt;
    also have &amp;quot;… = extremo_izquierda (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración declarativa detallada es›&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&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by (simp only: extremo_izquierda.simps(1)&lt;br /&gt;
                      inOrden.simps(1)&lt;br /&gt;
                      list.sel)&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI: &amp;quot;?P i&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;hd (inOrden (N x i d)) = &lt;br /&gt;
          hd (inOrden i @ [x] @ inOrden d)&amp;quot; &lt;br /&gt;
      by (simp only: inOrden.simps(2))&lt;br /&gt;
    also have &amp;quot;… = hd (inOrden i)&amp;quot; &lt;br /&gt;
      by (simp add: inOrdenNoVacio)&lt;br /&gt;
    also have &amp;quot;… = extremo_izquierda i&amp;quot; using HI by this&lt;br /&gt;
    also have &amp;quot;… = extremo_izquierda (N x i d)&amp;quot; &lt;br /&gt;
      by (simp only: extremo_izquierda.simps(2))&lt;br /&gt;
    finally show ?thesis by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración aplicativa detallada es›&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot; &lt;br /&gt;
  apply (induct a)&lt;br /&gt;
  apply (simp only: extremo_izquierda.simps(1)&lt;br /&gt;
                    inOrden.simps(1))&lt;br /&gt;
   apply (rule list.sel)&lt;br /&gt;
   apply (simp only: extremo_izquierda.simps(2)&lt;br /&gt;
                    inOrden.simps(2))&lt;br /&gt;
  apply (simp only: hd_append)&lt;br /&gt;
  apply (split if_split)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (simp only: inOrdenNoVacio)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (simp only:refl)&lt;br /&gt;
  done&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;
― ‹La demostración automática es›&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (cases a) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración estructurada es›&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 (cases a)&lt;br /&gt;
  fix x&lt;br /&gt;
  assume &amp;quot;a = H x&amp;quot;&lt;br /&gt;
  then show &amp;quot;?P a&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume H: &amp;quot;a = N x i d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P a&amp;quot;&lt;br /&gt;
  proof - &lt;br /&gt;
    have &amp;quot;hd (preOrden a) = hd (preOrden (N x i d))&amp;quot; using H by simp&lt;br /&gt;
    also have &amp;quot;… = 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 i @ postOrden d @ [x])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = last (postOrden (N x i d))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = last (postOrden a)&amp;quot; using H by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración declarativa detallada es›&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 (cases a)&lt;br /&gt;
  fix x&lt;br /&gt;
  assume &amp;quot;a = H x&amp;quot;&lt;br /&gt;
  then show &amp;quot;?P a&amp;quot; by (simp only: preOrden.simps(1)&lt;br /&gt;
                                  postOrden.simps(1)&lt;br /&gt;
                                  last.simps&lt;br /&gt;
                                  if_P&lt;br /&gt;
                                  list.sel)&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume H: &amp;quot;a = N x i d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P a&amp;quot;&lt;br /&gt;
  proof - &lt;br /&gt;
    have &amp;quot;hd (preOrden a) = hd (preOrden (N x i d))&amp;quot; using H &lt;br /&gt;
        by (rule arg_cong)&lt;br /&gt;
      also have &amp;quot;… = hd (x # (preOrden i @ preOrden d))&amp;quot; &lt;br /&gt;
        by (simp only: preOrden.simps(2))&lt;br /&gt;
      also have &amp;quot;… = x&amp;quot; by (simp only: list.sel)&lt;br /&gt;
      also have &amp;quot;… = last ((postOrden i @ postOrden d) @ [x])&amp;quot;&lt;br /&gt;
        by (simp only: last_snoc)&lt;br /&gt;
    also have &amp;quot;… = last (postOrden i @ postOrden d @ [x])&amp;quot;&lt;br /&gt;
      by (simp only: append_assoc)&lt;br /&gt;
    also have &amp;quot;… = last (postOrden (N x i d))&amp;quot; &lt;br /&gt;
      by (simp only: postOrden.simps(2))&lt;br /&gt;
    also have &amp;quot;… = last (postOrden a)&amp;quot; by (simp only:H)&lt;br /&gt;
    finally show ?thesis by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración aplicativa detallada es›&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;(is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
  apply (cases a)&lt;br /&gt;
  apply (simp only: preOrden.simps(1)&lt;br /&gt;
                    postOrden.simps(1)&lt;br /&gt;
                    last.simps&lt;br /&gt;
                    if_P)&lt;br /&gt;
   apply (rule list.sel)&lt;br /&gt;
    apply (simp only: preOrden.simps(2)&lt;br /&gt;
                    postOrden.simps(2))&lt;br /&gt;
  apply (simp only: append_assoc[THEN sym])&lt;br /&gt;
  apply (simp only: last_snoc)&lt;br /&gt;
  apply (simp only: list.sel)&lt;br /&gt;
  done&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;
― ‹La demostración automática es›&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (cases a) auto&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración estructurada es›&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (cases a)&lt;br /&gt;
  fix x&lt;br /&gt;
  assume &amp;quot;a = H x&amp;quot;&lt;br /&gt;
  then show &amp;quot;?P a&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume H: &amp;quot;a = N x i d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P a&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;hd (preOrden a) = hd (preOrden (N x i d))&amp;quot; using H by simp&lt;br /&gt;
    also have &amp;quot;… = 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;… = raiz (N x i d)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = raiz a&amp;quot; using H by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración declarativa detallada es›&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (cases a)&lt;br /&gt;
  fix x&lt;br /&gt;
  assume &amp;quot;a = H x&amp;quot;&lt;br /&gt;
  then show &amp;quot;?P a&amp;quot; by  (simp only: preOrden.simps(1)&lt;br /&gt;
                                   raiz.simps(1)&lt;br /&gt;
                                    list.sel)&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume H: &amp;quot;a = N x i d&amp;quot;&lt;br /&gt;
  then show &amp;quot;?P a&amp;quot; by  (simp only: preOrden.simps(2)&lt;br /&gt;
                                   raiz.simps(2)&lt;br /&gt;
                                   list.sel)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración aplicativa detallada es›&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
  apply (cases a)&lt;br /&gt;
  apply (simp only: preOrden.simps(1)&lt;br /&gt;
                    raiz.simps(1)&lt;br /&gt;
                    list.sel)&lt;br /&gt;
   apply (simp only: preOrden.simps(2)&lt;br /&gt;
                    raiz.simps(2)&lt;br /&gt;
                    list.sel)&lt;br /&gt;
  done&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;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Quickcheck found a counterexample:&lt;br /&gt;
  a = N a1 (H a2) (H a1)&lt;br /&gt;
  &lt;br /&gt;
  Evaluated terms:&lt;br /&gt;
  hd (inOrden a) = a2&lt;br /&gt;
  raiz a = a1&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;
― ‹La demostración automática es›&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (cases a) auto&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración estructurada es›&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (cases a)&lt;br /&gt;
  fix x&lt;br /&gt;
  assume &amp;quot;a = H x&amp;quot;&lt;br /&gt;
  then show &amp;quot;?P a&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume H: &amp;quot;a = N x i d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P a&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;last (postOrden a) = last (postOrden (N x i d))&amp;quot; using H by simp&lt;br /&gt;
    also have &amp;quot;… = last (postOrden i @ postOrden d @ [x])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = raiz a&amp;quot; using H by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración declarativa detallada es›&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (cases a)&lt;br /&gt;
  fix x&lt;br /&gt;
  assume &amp;quot;a = H x&amp;quot;&lt;br /&gt;
  then show &amp;quot;?P a&amp;quot; by (simp only: postOrden.simps(1)&lt;br /&gt;
                                  raiz.simps(1)&lt;br /&gt;
                                  last.simps  &lt;br /&gt;
                                  if_P)&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume H: &amp;quot;a = N x i d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P a&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;last (postOrden a) = last (postOrden (N x i d))&amp;quot; &lt;br /&gt;
      using H by (rule arg_cong)&lt;br /&gt;
    also have &amp;quot;… = last (postOrden i @ postOrden d @ [x])&amp;quot; &lt;br /&gt;
      by (simp only: postOrden.simps(2))&lt;br /&gt;
    also have &amp;quot;… = last ((postOrden i @ postOrden d) @ [x])&amp;quot; &lt;br /&gt;
      by (simp only: append_assoc)&lt;br /&gt;
    also have &amp;quot;… = x&amp;quot; by (simp only: last_snoc)&lt;br /&gt;
    also have &amp;quot;… = raiz a&amp;quot; using H by (simp only: raiz.simps(2))&lt;br /&gt;
    finally show ?thesis by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración aplicativa detallada es›&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot; &lt;br /&gt;
  apply (cases a)&lt;br /&gt;
  apply (simp only: postOrden.simps(1)&lt;br /&gt;
                    raiz.simps(1))&lt;br /&gt;
   apply (simp only: last.simps  &lt;br /&gt;
                     if_P)&lt;br /&gt;
   apply (simp only: postOrden.simps(2)&lt;br /&gt;
                    raiz.simps(2))&lt;br /&gt;
  apply (simp only: append_assoc[THEN sym])&lt;br /&gt;
  apply (simp only: last_snoc)&lt;br /&gt;
  done&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
</feed>