<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/RA2014/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Juacorvic</id>
	<title>Razonamiento automático (2014-15) - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/RA2014/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Juacorvic"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php/Especial:Contribuciones/Juacorvic"/>
	<updated>2026-07-17T18:10:22Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_11&amp;diff=281</id>
		<title>Relación 11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_11&amp;diff=281"/>
		<updated>2015-02-06T10:16:36Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R11: Plegados de listas y de árboles *}&lt;br /&gt;
 &lt;br /&gt;
theory R11&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
 &lt;br /&gt;
section {* Nuevas funciones sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  Nota. En esta relación se usará la función suma tal que (suma xs) es&lt;br /&gt;
  la suma de los elementos de xs, definida por&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Pedrosrei: corrijo, la definición que se pretendía era esta, debería&lt;br /&gt;
estar dada, es una errata. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun suma :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma [] = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;suma (x#xs) = x+suma xs&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  Las funciones de plegado, foldr y foldl, están definidas en la teoría&lt;br /&gt;
  List.thy por&lt;br /&gt;
       foldr :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b ⇒ &amp;#039;b&amp;quot;&lt;br /&gt;
       foldr f []       = id&lt;br /&gt;
       foldr f (x # xs) = f x ∘ foldr f xs&lt;br /&gt;
 &lt;br /&gt;
       foldl :: &amp;quot;(&amp;#039;b ⇒ &amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a list ⇒ &amp;#039;b&amp;quot;&lt;br /&gt;
       foldl f a []       = a&lt;br /&gt;
       foldl f a (x # xs) = foldl f (f a x) xs&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo,&lt;br /&gt;
     foldr (op +) [a,b,c] d        = a + (b + (c + d))&lt;br /&gt;
     foldl (op +) d [a,b,c]        = ((d + a) + b) + c&lt;br /&gt;
     foldr (op -) [9,4,2] (0::int) = 7&lt;br /&gt;
     foldl (op -) (0::int) [9,4,2] = -15&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;foldr (op +) [a,b,c] d&amp;quot;        -- &amp;quot;= a + (b + (c + d))&amp;quot;&lt;br /&gt;
value &amp;quot;foldl (op +) d [a,b,c]&amp;quot;        -- &amp;quot;= ((d + a) + b) + c&amp;quot;&lt;br /&gt;
value &amp;quot;foldr (op -) [9,4,2] (0::int)&amp;quot; -- &amp;quot;= 7&amp;quot;&lt;br /&gt;
value &amp;quot;foldl (op -) (0::int) [9,4,2]&amp;quot; -- &amp;quot;= -15&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar que&lt;br /&gt;
     suma xs = foldr (op +) xs 0&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma suma_foldr: &amp;quot;suma xs = foldr (op +) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
     length xs = foldr (λ x res. 1 + res) xs 0&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremarm,juacorvic&amp;quot;&lt;br /&gt;
lemma length_foldr: &amp;quot;length xs = foldr (λ x res. 1 + res) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. La aplicación repetida de foldr y map tiene el&lt;br /&gt;
  inconveniente de que la lista se recorre varias veces. Sin embargo, es&lt;br /&gt;
  suficiente recorrerla una vez como se muestra en el siguiente ejemplo,  &lt;br /&gt;
     suma (map (λx. x + 3) xs) = foldr h xs b&lt;br /&gt;
  Determinar los valores de h y b para que se verifique la igualdad&lt;br /&gt;
  anterior y demostrarla.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;suma (map (λx. x + 3) xs) = foldr (λ x y. x+y+3) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Generalizar el resultado anterior; es decir determinar&lt;br /&gt;
  los valores de h y b para que se verifique la igualdad &lt;br /&gt;
     foldr g (map f xs) a = foldr h xs b&lt;br /&gt;
  y demostrarla.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;foldr g (map f xs) a = foldr (g∘f) xs a&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. La siguiente función invierte una lista en tiempo lineal&lt;br /&gt;
     fun inversa_ac :: &amp;quot;[&amp;#039;a list, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;inversa_ac [] ys = ys&amp;quot;&lt;br /&gt;
     | &amp;quot;inversa_ac (x#xs) ys = (inversa_ac xs (x#ys))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     definition inversa_ac :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;inversa_ac xs ≡ inversa_ac_aux xs []&amp;quot;&lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     inversa_ac [a,d,b,c] = [c, b, d, a]&lt;br /&gt;
  Demostrar que inversa_ac se puede definir unsando foldl.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun inversa_ac_aux :: &amp;quot;[&amp;#039;a list, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa_ac_aux [] ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;inversa_ac_aux (x#xs) ys = (inversa_ac_aux xs (x#ys))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
definition inversa_ac :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa_ac xs ≡ inversa_ac_aux xs []&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;inversa_ac [a,d,b,c]&amp;quot; -- &amp;quot;= [c, b, d, a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma inversa_ac_aux_foldl: &lt;br /&gt;
  &amp;quot;inversa_ac_aux xs a = foldl (λ ys x. x#ys) a xs&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: a, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar la siguiente propiedad distributiva de la suma&lt;br /&gt;
  sobre la concatenación:&lt;br /&gt;
     suma (xs @ ys) = suma xs + suma ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma suma_append [simp]: &lt;br /&gt;
  &amp;quot;suma (xs @ ys) = suma xs + suma ys&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar una propiedad similar para foldr&lt;br /&gt;
     foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&lt;br /&gt;
  En este caso, hay que restringir el resultado teniendo en cuenta&lt;br /&gt;
  propiedades algebraicas de f y a.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei: Dales nombre a las cosas Jesús, te las nombro yo:&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma l1:&lt;br /&gt;
  assumes neutr: &amp;quot;(∀ x. (f a x = x))&amp;quot; and&lt;br /&gt;
          assoc: &amp;quot;(∀x y z. f (f x y) z = f x (f y z))&amp;quot;&lt;br /&gt;
  shows &amp;quot;foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;foldr f ([] @ ys) a = f (foldr f [] a) (foldr f ys a)&amp;quot;&lt;br /&gt;
    using neutr by simp&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀aa xs.&lt;br /&gt;
       foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a) ⟹&lt;br /&gt;
       foldr f ((aa # xs) @ ys) a = f (foldr f (aa # xs) a) (foldr f ys a)&amp;quot;&lt;br /&gt;
    using assoc by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob:&lt;br /&gt;
saco fuera las hipotesis porque se usan tambien en el ejercicio siguiente,&lt;br /&gt;
ademas la prueba queda mas corta *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition neutr :: &amp;quot;[&amp;#039;a ⇒ &amp;#039;b ⇒ &amp;#039;b, &amp;#039;a] ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;neutr f a == (∀ x. (f a x = x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition assoc :: &amp;quot;[&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a] ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;assoc f == (∀ x y z. f (f x y) z = f x (f y z))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Pedrosrei: esta es la versión automática del lema anterior, ¿para qué&lt;br /&gt;
 cambias el enunciado por uno equivalente? *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma l2: &amp;quot;⟦neutr f a ; assoc f⟧ &lt;br /&gt;
  ⟹ foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&amp;quot;&lt;br /&gt;
by (induct xs, simp add: neutr_def, simp add: assoc_def)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir, usando foldr, la función&lt;br /&gt;
     prod :: &amp;quot;nat list ⇒ nat&amp;quot;&lt;br /&gt;
  tal que (prod xs) es el producto de los elementos de xs. Por ejemplo,&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition prod :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;prod xs ≡ foldr (op *) xs 1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;prod [2::nat,3,5] = 30&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar directamente (es decir, sin inducción) que&lt;br /&gt;
     prod (xs @ ys) = prod xs * prod ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;prod (xs @ ys) = prod xs * prod ys&amp;quot;&lt;br /&gt;
by (simp only: prod_def, rule l2, simp add: neutr_def, simp add: assoc_def)&lt;br /&gt;
&lt;br /&gt;
section {* Functiones sobre árboles *}&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que tiene información sólo en los nodos. Por ejemplo,&lt;br /&gt;
  el árbol &lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H c H) e (N H g H)&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
datatype &amp;#039;a arbol = H | N &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;N (N H c H) e (N H g H)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. 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 (N H c H) e (N H g H))&lt;br /&gt;
     = [e,c,g]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 = []&amp;quot;&lt;br /&gt;
 |&amp;quot;preOrden (N i x d) = x#(preOrden i @ preOrden d)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;preOrden (N (N H c H) e (N H g H)) = [e,c,g]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. 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 (N H c H) e (N H g H))&lt;br /&gt;
     = [c,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 = []&amp;quot;&lt;br /&gt;
 |&amp;quot;postOrden (N i x d) = (postOrden i) @ (postOrden d) @ [x]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;postOrden (N (N H c H) e (N H g H)) = [c,g,e]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Definir, usando un acumulador, la función &lt;br /&gt;
     postOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (postOrdenA a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     postOrdenA (N (N H c H) e (N H g H))&lt;br /&gt;
     = [c,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun postOrdenAaux :: &amp;quot;[&amp;#039;a arbol, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrdenAaux H xs = xs&amp;quot;&lt;br /&gt;
 |&amp;quot;postOrdenAaux (N i x d) xs = (postOrdenAaux i (postOrdenAaux d (x#xs)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition postOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrdenA a ≡ postOrdenAaux a []&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;postOrdenA (N (N H c H) e (N H g H)) = [c,g,e]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar que&lt;br /&gt;
     postOrdenAaux a xs = (postOrden a) @ xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrdenAaux a xs = (postOrden a) @ xs&amp;quot;&lt;br /&gt;
by (induct a arbitrary: xs, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función&lt;br /&gt;
     foldl_arbol :: &amp;quot;(&amp;#039;b =&amp;gt; &amp;#039;a =&amp;gt; &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a arbol ⇒ &amp;#039;b&amp;quot; where&lt;br /&gt;
  tal que (foldl_arbol f b a) es el plegado izquierdo del árbol a con la&lt;br /&gt;
  operación f y elemento inicial b.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun foldl_arbol :: &amp;quot;(&amp;#039;b =&amp;gt; &amp;#039;a =&amp;gt; &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a arbol ⇒ &amp;#039;b&amp;quot; where&lt;br /&gt;
  &amp;quot;foldl_arbol f b H = b&amp;quot;&lt;br /&gt;
 |&amp;quot;foldl_arbol f b (N i x d) = foldl_arbol f (foldl_arbol f (f b x) d) i&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar que&lt;br /&gt;
     postOrdenAaux t a = foldl_arbol (λ xs x. Cons x xs) a t&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrdenAaux t a = foldl_arbol (λ xs x. Cons x xs) a t&amp;quot;&lt;br /&gt;
by (induct t arbitrary: a, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función&lt;br /&gt;
     suma_arbol :: &amp;quot;nat arbol ⇒ nat&amp;quot; &lt;br /&gt;
  tal que (suma_arbol a) es la suma de los elementos del árbol de&lt;br /&gt;
  números naturales a.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun suma_arbol :: &amp;quot;nat arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma_arbol H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;suma_arbol (N i x d) = (suma_arbol i) + x + (suma_arbol d)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar que&lt;br /&gt;
     suma_arbol a = suma (preOrden a)&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;suma_arbol a = suma (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_11&amp;diff=280</id>
		<title>Relación 11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_11&amp;diff=280"/>
		<updated>2015-02-06T10:10:04Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R11: Plegados de listas y de árboles *}&lt;br /&gt;
 &lt;br /&gt;
theory R11&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
 &lt;br /&gt;
section {* Nuevas funciones sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  Nota. En esta relación se usará la función suma tal que (suma xs) es&lt;br /&gt;
  la suma de los elementos de xs, definida por&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Pedrosrei: corrijo, la definición que se pretendía era esta, debería&lt;br /&gt;
estar dada, es una errata. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun suma :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma [] = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;suma (x#xs) = x+suma xs&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  Las funciones de plegado, foldr y foldl, están definidas en la teoría&lt;br /&gt;
  List.thy por&lt;br /&gt;
       foldr :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b ⇒ &amp;#039;b&amp;quot;&lt;br /&gt;
       foldr f []       = id&lt;br /&gt;
       foldr f (x # xs) = f x ∘ foldr f xs&lt;br /&gt;
 &lt;br /&gt;
       foldl :: &amp;quot;(&amp;#039;b ⇒ &amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a list ⇒ &amp;#039;b&amp;quot;&lt;br /&gt;
       foldl f a []       = a&lt;br /&gt;
       foldl f a (x # xs) = foldl f (f a x) xs&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo,&lt;br /&gt;
     foldr (op +) [a,b,c] d        = a + (b + (c + d))&lt;br /&gt;
     foldl (op +) d [a,b,c]        = ((d + a) + b) + c&lt;br /&gt;
     foldr (op -) [9,4,2] (0::int) = 7&lt;br /&gt;
     foldl (op -) (0::int) [9,4,2] = -15&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;foldr (op +) [a,b,c] d&amp;quot;        -- &amp;quot;= a + (b + (c + d))&amp;quot;&lt;br /&gt;
value &amp;quot;foldl (op +) d [a,b,c]&amp;quot;        -- &amp;quot;= ((d + a) + b) + c&amp;quot;&lt;br /&gt;
value &amp;quot;foldr (op -) [9,4,2] (0::int)&amp;quot; -- &amp;quot;= 7&amp;quot;&lt;br /&gt;
value &amp;quot;foldl (op -) (0::int) [9,4,2]&amp;quot; -- &amp;quot;= -15&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar que&lt;br /&gt;
     suma xs = foldr (op +) xs 0&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma suma_foldr: &amp;quot;suma xs = foldr (op +) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
     length xs = foldr (λ x res. 1 + res) xs 0&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremarm,juacorvic&amp;quot;&lt;br /&gt;
lemma length_foldr: &amp;quot;length xs = foldr (λ x res. 1 + res) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. La aplicación repetida de foldr y map tiene el&lt;br /&gt;
  inconveniente de que la lista se recorre varias veces. Sin embargo, es&lt;br /&gt;
  suficiente recorrerla una vez como se muestra en el siguiente ejemplo,  &lt;br /&gt;
     suma (map (λx. x + 3) xs) = foldr h xs b&lt;br /&gt;
  Determinar los valores de h y b para que se verifique la igualdad&lt;br /&gt;
  anterior y demostrarla.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;suma (map (λx. x + 3) xs) = foldr (λ x y. x+y+3) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Generalizar el resultado anterior; es decir determinar&lt;br /&gt;
  los valores de h y b para que se verifique la igualdad &lt;br /&gt;
     foldr g (map f xs) a = foldr h xs b&lt;br /&gt;
  y demostrarla.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;foldr g (map f xs) a = foldr (g∘f) xs a&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. La siguiente función invierte una lista en tiempo lineal&lt;br /&gt;
     fun inversa_ac :: &amp;quot;[&amp;#039;a list, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;inversa_ac [] ys = ys&amp;quot;&lt;br /&gt;
     | &amp;quot;inversa_ac (x#xs) ys = (inversa_ac xs (x#ys))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     definition inversa_ac :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;inversa_ac xs ≡ inversa_ac_aux xs []&amp;quot;&lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     inversa_ac [a,d,b,c] = [c, b, d, a]&lt;br /&gt;
  Demostrar que inversa_ac se puede definir unsando foldl.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun inversa_ac_aux :: &amp;quot;[&amp;#039;a list, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa_ac_aux [] ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;inversa_ac_aux (x#xs) ys = (inversa_ac_aux xs (x#ys))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
definition inversa_ac :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa_ac xs ≡ inversa_ac_aux xs []&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;inversa_ac [a,d,b,c]&amp;quot; -- &amp;quot;= [c, b, d, a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma inversa_ac_aux_foldl: &lt;br /&gt;
  &amp;quot;inversa_ac_aux xs a = foldl (λ ys x. x#ys) a xs&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: a, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar la siguiente propiedad distributiva de la suma&lt;br /&gt;
  sobre la concatenación:&lt;br /&gt;
     suma (xs @ ys) = suma xs + suma ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma suma_append [simp]: &lt;br /&gt;
  &amp;quot;suma (xs @ ys) = suma xs + suma ys&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar una propiedad similar para foldr&lt;br /&gt;
     foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&lt;br /&gt;
  En este caso, hay que restringir el resultado teniendo en cuenta&lt;br /&gt;
  propiedades algebraicas de f y a.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei: Dales nombre a las cosas Jesús, te las nombro yo:&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma l1:&lt;br /&gt;
  assumes neutr: &amp;quot;(∀ x. (f a x = x))&amp;quot; and&lt;br /&gt;
          assoc: &amp;quot;(∀x y z. f (f x y) z = f x (f y z))&amp;quot;&lt;br /&gt;
  shows &amp;quot;foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;foldr f ([] @ ys) a = f (foldr f [] a) (foldr f ys a)&amp;quot;&lt;br /&gt;
    using neutr by simp&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀aa xs.&lt;br /&gt;
       foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a) ⟹&lt;br /&gt;
       foldr f ((aa # xs) @ ys) a = f (foldr f (aa # xs) a) (foldr f ys a)&amp;quot;&lt;br /&gt;
    using assoc by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob:&lt;br /&gt;
saco fuera las hipotesis porque se usan tambien en el ejercicio siguiente,&lt;br /&gt;
ademas la prueba queda mas corta *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition neutr :: &amp;quot;[&amp;#039;a ⇒ &amp;#039;b ⇒ &amp;#039;b, &amp;#039;a] ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;neutr f a == (∀ x. (f a x = x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition assoc :: &amp;quot;[&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a] ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;assoc f == (∀ x y z. f (f x y) z = f x (f y z))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Pedrosrei: esta es la versión automática del lema anterior, ¿para qué&lt;br /&gt;
 cambias el enunciado por uno equivalente? *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma l2: &amp;quot;⟦neutr f a ; assoc f⟧ &lt;br /&gt;
  ⟹ foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&amp;quot;&lt;br /&gt;
by (induct xs, simp add: neutr_def, simp add: assoc_def)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir, usando foldr, la función&lt;br /&gt;
     prod :: &amp;quot;nat list ⇒ nat&amp;quot;&lt;br /&gt;
  tal que (prod xs) es el producto de los elementos de xs. Por ejemplo,&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition prod :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;prod xs ≡ foldr (op *) xs 1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;prod [2::nat,3,5] = 30&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar directamente (es decir, sin inducción) que&lt;br /&gt;
     prod (xs @ ys) = prod xs * prod ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;prod (xs @ ys) = prod xs * prod ys&amp;quot;&lt;br /&gt;
by (simp only: prod_def, rule l2, simp add: neutr_def, simp add: assoc_def)&lt;br /&gt;
&lt;br /&gt;
section {* Functiones sobre árboles *}&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que tiene información sólo en los nodos. Por ejemplo,&lt;br /&gt;
  el árbol &lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H c H) e (N H g H)&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
datatype &amp;#039;a arbol = H | N &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;N (N H c H) e (N H g H)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. 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 (N H c H) e (N H g H))&lt;br /&gt;
     = [e,c,g]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 = []&amp;quot;&lt;br /&gt;
 |&amp;quot;preOrden (N i x d) = x#(preOrden i @ preOrden d)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;preOrden (N (N H c H) e (N H g H)) = [e,c,g]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. 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 (N H c H) e (N H g H))&lt;br /&gt;
     = [c,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 = []&amp;quot;&lt;br /&gt;
 |&amp;quot;postOrden (N i x d) = (postOrden i) @ (postOrden d) @ [x]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;postOrden (N (N H c H) e (N H g H)) = [c,g,e]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Definir, usando un acumulador, la función &lt;br /&gt;
     postOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (postOrdenA a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     postOrdenA (N (N H c H) e (N H g H))&lt;br /&gt;
     = [c,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun postOrdenAaux :: &amp;quot;[&amp;#039;a arbol, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrdenAaux H xs = xs&amp;quot;&lt;br /&gt;
 |&amp;quot;postOrdenAaux (N i x d) xs = (postOrdenAaux i (postOrdenAaux d (x#xs)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition postOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrdenA a ≡ postOrdenAaux a []&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;postOrdenA (N (N H c H) e (N H g H)) = [c,g,e]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar que&lt;br /&gt;
     postOrdenAaux a xs = (postOrden a) @ xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrdenAaux a xs = (postOrden a) @ xs&amp;quot;&lt;br /&gt;
by (induct a arbitrary: xs, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función&lt;br /&gt;
     foldl_arbol :: &amp;quot;(&amp;#039;b =&amp;gt; &amp;#039;a =&amp;gt; &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a arbol ⇒ &amp;#039;b&amp;quot; where&lt;br /&gt;
  tal que (foldl_arbol f b a) es el plegado izquierdo del árbol a con la&lt;br /&gt;
  operación f y elemento inicial b.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun foldl_arbol :: &amp;quot;(&amp;#039;b =&amp;gt; &amp;#039;a =&amp;gt; &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a arbol ⇒ &amp;#039;b&amp;quot; where&lt;br /&gt;
  &amp;quot;foldl_arbol f b H = b&amp;quot;&lt;br /&gt;
 |&amp;quot;foldl_arbol f b (N i x d) = foldl_arbol f (foldl_arbol f (f b x) d) i&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar que&lt;br /&gt;
     postOrdenAaux t a = foldl_arbol (λ xs x. Cons x xs) a t&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrdenAaux t a = foldl_arbol (λ xs x. Cons x xs) a t&amp;quot;&lt;br /&gt;
by (induct t arbitrary: a, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función&lt;br /&gt;
     suma_arbol :: &amp;quot;nat arbol ⇒ nat&amp;quot; &lt;br /&gt;
  tal que (suma_arbol a) es la suma de los elementos del árbol de&lt;br /&gt;
  números naturales a.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun suma_arbol :: &amp;quot;nat arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma_arbol H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;suma_arbol (N i x d) = (suma_arbol i) + x + (suma_arbol d)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar que&lt;br /&gt;
     suma_arbol a = suma (preOrden a)&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;suma_arbol a = suma (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_11&amp;diff=269</id>
		<title>Relación 11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_11&amp;diff=269"/>
		<updated>2015-01-29T07:49:58Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R11: Plegados de listas y de árboles *}&lt;br /&gt;
 &lt;br /&gt;
theory R11&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
 &lt;br /&gt;
section {* Nuevas funciones sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  Nota. En esta relación se usará la función suma tal que (suma xs) es&lt;br /&gt;
  la suma de los elementos de xs, definida por&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Pedrosrei: corrijo, la definición que se pretendía era esta, debería&lt;br /&gt;
estar dada, es una errata. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun suma :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma [] = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;suma (x#xs) = x+suma xs&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  Las funciones de plegado, foldr y foldl, están definidas en la teoría&lt;br /&gt;
  List.thy por&lt;br /&gt;
       foldr :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b ⇒ &amp;#039;b&amp;quot;&lt;br /&gt;
       foldr f []       = id&lt;br /&gt;
       foldr f (x # xs) = f x ∘ foldr f xs&lt;br /&gt;
 &lt;br /&gt;
       foldl :: &amp;quot;(&amp;#039;b ⇒ &amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a list ⇒ &amp;#039;b&amp;quot;&lt;br /&gt;
       foldl f a []       = a&lt;br /&gt;
       foldl f a (x # xs) = foldl f (f a x) xs&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo,&lt;br /&gt;
     foldr (op +) [a,b,c] d        = a + (b + (c + d))&lt;br /&gt;
     foldl (op +) d [a,b,c]        = ((d + a) + b) + c&lt;br /&gt;
     foldr (op -) [9,4,2] (0::int) = 7&lt;br /&gt;
     foldl (op -) (0::int) [9,4,2] = -15&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;foldr (op +) [a,b,c] d&amp;quot;        -- &amp;quot;= a + (b + (c + d))&amp;quot;&lt;br /&gt;
value &amp;quot;foldl (op +) d [a,b,c]&amp;quot;        -- &amp;quot;= ((d + a) + b) + c&amp;quot;&lt;br /&gt;
value &amp;quot;foldr (op -) [9,4,2] (0::int)&amp;quot; -- &amp;quot;= 7&amp;quot;&lt;br /&gt;
value &amp;quot;foldl (op -) (0::int) [9,4,2]&amp;quot; -- &amp;quot;= -15&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar que&lt;br /&gt;
     suma xs = foldr (op +) xs 0&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma suma_foldr: &amp;quot;suma xs = foldr (op +) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
     length xs = foldr (λ x res. 1 + res) xs 0&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremarm,juacorvic&amp;quot;&lt;br /&gt;
lemma length_foldr: &amp;quot;length xs = foldr (λ x res. 1 + res) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. La aplicación repetida de foldr y map tiene el&lt;br /&gt;
  inconveniente de que la lista se recorre varias veces. Sin embargo, es&lt;br /&gt;
  suficiente recorrerla una vez como se muestra en el siguiente ejemplo,  &lt;br /&gt;
     suma (map (λx. x + 3) xs) = foldr h xs b&lt;br /&gt;
  Determinar los valores de h y b para que se verifique la igualdad&lt;br /&gt;
  anterior y demostrarla.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;suma (map (λx. x + 3) xs) = foldr (λ x y. x+y+3) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Generalizar el resultado anterior; es decir determinar&lt;br /&gt;
  los valores de h y b para que se verifique la igualdad &lt;br /&gt;
     foldr g (map f xs) a = foldr h xs b&lt;br /&gt;
  y demostrarla.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;foldr g (map f xs) a = foldr (g∘f) xs a&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. La siguiente función invierte una lista en tiempo lineal&lt;br /&gt;
     fun inversa_ac :: &amp;quot;[&amp;#039;a list, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;inversa_ac [] ys = ys&amp;quot;&lt;br /&gt;
     | &amp;quot;inversa_ac (x#xs) ys = (inversa_ac xs (x#ys))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     definition inversa_ac :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;inversa_ac xs ≡ inversa_ac_aux xs []&amp;quot;&lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     inversa_ac [a,d,b,c] = [c, b, d, a]&lt;br /&gt;
  Demostrar que inversa_ac se puede definir unsando foldl.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun inversa_ac_aux :: &amp;quot;[&amp;#039;a list, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa_ac_aux [] ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;inversa_ac_aux (x#xs) ys = (inversa_ac_aux xs (x#ys))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
definition inversa_ac :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa_ac xs ≡ inversa_ac_aux xs []&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;inversa_ac [a,d,b,c]&amp;quot; -- &amp;quot;= [c, b, d, a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma inversa_ac_aux_foldl: &lt;br /&gt;
  &amp;quot;inversa_ac_aux xs a = foldl (λ ys x. x#ys) a xs&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: a, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar la siguiente propiedad distributiva de la suma&lt;br /&gt;
  sobre la concatenación:&lt;br /&gt;
     suma (xs @ ys) = suma xs + suma ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma suma_append [simp]: &lt;br /&gt;
  &amp;quot;suma (xs @ ys) = suma xs + suma ys&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar una propiedad similar para foldr&lt;br /&gt;
     foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&lt;br /&gt;
  En este caso, hay que restringir el resultado teniendo en cuenta&lt;br /&gt;
  propiedades algebraicas de f y a.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei: Dales nombre a las cosas Jesús, te las nombro yo:&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma l1:&lt;br /&gt;
  assumes neutr: &amp;quot;(∀ x. (f a x = x))&amp;quot; and&lt;br /&gt;
          assoc: &amp;quot;(∀x y z. f (f x y) z = f x (f y z))&amp;quot;&lt;br /&gt;
  shows &amp;quot;foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;foldr f ([] @ ys) a = f (foldr f [] a) (foldr f ys a)&amp;quot;&lt;br /&gt;
    using neutr by simp&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀aa xs.&lt;br /&gt;
       foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a) ⟹&lt;br /&gt;
       foldr f ((aa # xs) @ ys) a = f (foldr f (aa # xs) a) (foldr f ys a)&amp;quot;&lt;br /&gt;
    using assoc by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob:&lt;br /&gt;
saco fuera las hipotesis porque se usan tambien en el ejercicio siguiente,&lt;br /&gt;
ademas la prueba queda mas corta *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition neutr :: &amp;quot;[&amp;#039;a ⇒ &amp;#039;b ⇒ &amp;#039;b, &amp;#039;a] ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;neutr f a == (∀ x. (f a x = x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition assoc :: &amp;quot;[&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a] ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;assoc f == (∀ x y z. f (f x y) z = f x (f y z))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Pedrosrei: esta es la versión automática del lema anterior, ¿para qué&lt;br /&gt;
 cambias el enunciado por uno equivalente? *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma l2: &amp;quot;⟦neutr f a ; assoc f⟧ &lt;br /&gt;
  ⟹ foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&amp;quot;&lt;br /&gt;
by (induct xs, simp add: neutr_def, simp add: assoc_def)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir, usando foldr, la función&lt;br /&gt;
     prod :: &amp;quot;nat list ⇒ nat&amp;quot;&lt;br /&gt;
  tal que (prod xs) es el producto de los elementos de xs. Por ejemplo,&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition prod :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;prod xs ≡ foldr (op *) xs 1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;prod [2::nat,3,5] = 30&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar directamente (es decir, sin inducción) que&lt;br /&gt;
     prod (xs @ ys) = prod xs * prod ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;prod (xs @ ys) = prod xs * prod ys&amp;quot;&lt;br /&gt;
by (simp only: prod_def, rule l2, simp add: neutr_def, simp add: assoc_def)&lt;br /&gt;
&lt;br /&gt;
section {* Functiones sobre árboles *}&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que tiene información sólo en los nodos. Por ejemplo,&lt;br /&gt;
  el árbol &lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H c H) e (N H g H)&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
datatype &amp;#039;a arbol = H | N &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;N (N H c H) e (N H g H)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. 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 (N H c H) e (N H g H))&lt;br /&gt;
     = [e,c,g]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 = []&amp;quot;&lt;br /&gt;
 |&amp;quot;preOrden (N i x d) = x#(preOrden i @ preOrden d)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;preOrden (N (N H c H) e (N H g H)) = [e,c,g]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. 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 (N H c H) e (N H g H))&lt;br /&gt;
     = [c,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 = []&amp;quot;&lt;br /&gt;
 |&amp;quot;postOrden (N i x d) = (postOrden i) @ (postOrden d) @ [x]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;postOrden (N (N H c H) e (N H g H)) = [c,g,e]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Definir, usando un acumulador, la función &lt;br /&gt;
     postOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (postOrdenA a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     postOrdenA (N (N H c H) e (N H g H))&lt;br /&gt;
     = [c,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun postOrdenAaux :: &amp;quot;[&amp;#039;a arbol, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrdenAaux H xs = xs&amp;quot;&lt;br /&gt;
 |&amp;quot;postOrdenAaux (N i x d) xs = (postOrdenAaux i (postOrdenAaux d (x#xs)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition postOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrdenA a ≡ postOrdenAaux a []&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;postOrdenA (N (N H c H) e (N H g H)) = [c,g,e]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar que&lt;br /&gt;
     postOrdenAaux a xs = (postOrden a) @ xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrdenAaux a xs = (postOrden a) @ xs&amp;quot;&lt;br /&gt;
by (induct a arbitrary: xs, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función&lt;br /&gt;
     foldl_arbol :: &amp;quot;(&amp;#039;b =&amp;gt; &amp;#039;a =&amp;gt; &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a arbol ⇒ &amp;#039;b&amp;quot; where&lt;br /&gt;
  tal que (foldl_arbol f b a) es el plegado izquierdo del árbol a con la&lt;br /&gt;
  operación f y elemento inicial b.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun foldl_arbol :: &amp;quot;(&amp;#039;b =&amp;gt; &amp;#039;a =&amp;gt; &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a arbol ⇒ &amp;#039;b&amp;quot; where&lt;br /&gt;
  &amp;quot;foldl_arbol f b H = b&amp;quot;&lt;br /&gt;
 |&amp;quot;foldl_arbol f b (N i x d) = foldl_arbol f (foldl_arbol f (f b x) d) i&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar que&lt;br /&gt;
     postOrdenAaux t a = foldl_arbol (λ xs x. Cons x xs) a t&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrdenAaux t a = foldl_arbol (λ xs x. Cons x xs) a t&amp;quot;&lt;br /&gt;
by (induct t arbitrary: a, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función&lt;br /&gt;
     suma_arbol :: &amp;quot;nat arbol ⇒ nat&amp;quot; &lt;br /&gt;
  tal que (suma_arbol a) es la suma de los elementos del árbol de&lt;br /&gt;
  números naturales a.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun suma_arbol :: &amp;quot;nat arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma_arbol H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;suma_arbol (N i x d) = (suma_arbol i) + x + (suma_arbol d)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar que&lt;br /&gt;
     suma_arbol a = suma (preOrden a)&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;suma_arbol a = suma (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_11&amp;diff=268</id>
		<title>Relación 11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_11&amp;diff=268"/>
		<updated>2015-01-26T08:41:43Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R11: Plegados de listas y de árboles *}&lt;br /&gt;
 &lt;br /&gt;
theory R11&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
 &lt;br /&gt;
section {* Nuevas funciones sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  Nota. En esta relación se usará la función suma tal que (suma xs) es&lt;br /&gt;
  la suma de los elementos de xs, definida por&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Pedrosrei: corrijo, la definición que se pretendía era esta, debería&lt;br /&gt;
estar dada, es una errata. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun suma :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma [] = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;suma (x#xs) = x+suma xs&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  Las funciones de plegado, foldr y foldl, están definidas en la teoría&lt;br /&gt;
  List.thy por&lt;br /&gt;
       foldr :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b ⇒ &amp;#039;b&amp;quot;&lt;br /&gt;
       foldr f []       = id&lt;br /&gt;
       foldr f (x # xs) = f x ∘ foldr f xs&lt;br /&gt;
 &lt;br /&gt;
       foldl :: &amp;quot;(&amp;#039;b ⇒ &amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a list ⇒ &amp;#039;b&amp;quot;&lt;br /&gt;
       foldl f a []       = a&lt;br /&gt;
       foldl f a (x # xs) = foldl f (f a x) xs&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo,&lt;br /&gt;
     foldr (op +) [a,b,c] d        = a + (b + (c + d))&lt;br /&gt;
     foldl (op +) d [a,b,c]        = ((d + a) + b) + c&lt;br /&gt;
     foldr (op -) [9,4,2] (0::int) = 7&lt;br /&gt;
     foldl (op -) (0::int) [9,4,2] = -15&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;foldr (op +) [a,b,c] d&amp;quot;        -- &amp;quot;= a + (b + (c + d))&amp;quot;&lt;br /&gt;
value &amp;quot;foldl (op +) d [a,b,c]&amp;quot;        -- &amp;quot;= ((d + a) + b) + c&amp;quot;&lt;br /&gt;
value &amp;quot;foldr (op -) [9,4,2] (0::int)&amp;quot; -- &amp;quot;= 7&amp;quot;&lt;br /&gt;
value &amp;quot;foldl (op -) (0::int) [9,4,2]&amp;quot; -- &amp;quot;= -15&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar que&lt;br /&gt;
     suma xs = foldr (op +) xs 0&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma suma_foldr: &amp;quot;suma xs = foldr (op +) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
     length xs = foldr (λ x res. 1 + res) xs 0&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremarm,juacorvic&amp;quot;&lt;br /&gt;
lemma length_foldr: &amp;quot;length xs = foldr (λ x res. 1 + res) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. La aplicación repetida de foldr y map tiene el&lt;br /&gt;
  inconveniente de que la lista se recorre varias veces. Sin embargo, es&lt;br /&gt;
  suficiente recorrerla una vez como se muestra en el siguiente ejemplo,  &lt;br /&gt;
     suma (map (λx. x + 3) xs) = foldr h xs b&lt;br /&gt;
  Determinar los valores de h y b para que se verifique la igualdad&lt;br /&gt;
  anterior y demostrarla.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;suma (map (λx. x + 3) xs) = foldr (λ x y. x+y+3) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Generalizar el resultado anterior; es decir determinar&lt;br /&gt;
  los valores de h y b para que se verifique la igualdad &lt;br /&gt;
     foldr g (map f xs) a = foldr h xs b&lt;br /&gt;
  y demostrarla.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;foldr g (map f xs) a = foldr (g∘f) xs a&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. La siguiente función invierte una lista en tiempo lineal&lt;br /&gt;
     fun inversa_ac :: &amp;quot;[&amp;#039;a list, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;inversa_ac [] ys = ys&amp;quot;&lt;br /&gt;
     | &amp;quot;inversa_ac (x#xs) ys = (inversa_ac xs (x#ys))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     definition inversa_ac :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;inversa_ac xs ≡ inversa_ac_aux xs []&amp;quot;&lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     inversa_ac [a,d,b,c] = [c, b, d, a]&lt;br /&gt;
  Demostrar que inversa_ac se puede definir unsando foldl.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun inversa_ac_aux :: &amp;quot;[&amp;#039;a list, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa_ac_aux [] ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;inversa_ac_aux (x#xs) ys = (inversa_ac_aux xs (x#ys))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
definition inversa_ac :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa_ac xs ≡ inversa_ac_aux xs []&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;inversa_ac [a,d,b,c]&amp;quot; -- &amp;quot;= [c, b, d, a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma inversa_ac_aux_foldl: &lt;br /&gt;
  &amp;quot;inversa_ac_aux xs a = foldl (λ ys x. x#ys) a xs&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: a, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar la siguiente propiedad distributiva de la suma&lt;br /&gt;
  sobre la concatenación:&lt;br /&gt;
     suma (xs @ ys) = suma xs + suma ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma suma_append [simp]: &lt;br /&gt;
  &amp;quot;suma (xs @ ys) = suma xs + suma ys&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar una propiedad similar para foldr&lt;br /&gt;
     foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&lt;br /&gt;
  En este caso, hay que restringir el resultado teniendo en cuenta&lt;br /&gt;
  propiedades algebraicas de f y a.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei: Dales nombre a las cosas Jesús, te las nombro yo:&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma l1:&lt;br /&gt;
  assumes neutr: &amp;quot;(∀ x. (f a x = x))&amp;quot; and&lt;br /&gt;
          assoc: &amp;quot;(∀x y z. f (f x y) z = f x (f y z))&amp;quot;&lt;br /&gt;
  shows &amp;quot;foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;foldr f ([] @ ys) a = f (foldr f [] a) (foldr f ys a)&amp;quot;&lt;br /&gt;
    using neutr by simp&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀aa xs.&lt;br /&gt;
       foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a) ⟹&lt;br /&gt;
       foldr f ((aa # xs) @ ys) a = f (foldr f (aa # xs) a) (foldr f ys a)&amp;quot;&lt;br /&gt;
    using assoc by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob:&lt;br /&gt;
saco fuera las hipotesis porque se usan tambien en el ejercicio siguiente,&lt;br /&gt;
ademas la prueba queda mas corta *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition neutr :: &amp;quot;[&amp;#039;a ⇒ &amp;#039;b ⇒ &amp;#039;b, &amp;#039;a] ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;neutr f a == (∀ x. (f a x = x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition assoc :: &amp;quot;[&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a] ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;assoc f == (∀ x y z. f (f x y) z = f x (f y z))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Pedrosrei: esta es la versión automática del lema anterior, ¿para qué&lt;br /&gt;
 cambias el enunciado por uno equivalente? *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma l2: &amp;quot;⟦neutr f a ; assoc f⟧ &lt;br /&gt;
  ⟹ foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&amp;quot;&lt;br /&gt;
by (induct xs, simp add: neutr_def, simp add: assoc_def)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir, usando foldr, la función&lt;br /&gt;
     prod :: &amp;quot;nat list ⇒ nat&amp;quot;&lt;br /&gt;
  tal que (prod xs) es el producto de los elementos de xs. Por ejemplo,&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition prod :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;prod xs ≡ foldr (op *) xs 1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;prod [2::nat,3,5] = 30&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar directamente (es decir, sin inducción) que&lt;br /&gt;
     prod (xs @ ys) = prod xs * prod ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;prod (xs @ ys) = prod xs * prod ys&amp;quot;&lt;br /&gt;
by (simp only: prod_def, rule l2, simp add: neutr_def, simp add: assoc_def)&lt;br /&gt;
&lt;br /&gt;
section {* Functiones sobre árboles *}&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que tiene información sólo en los nodos. Por ejemplo,&lt;br /&gt;
  el árbol &lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H c H) e (N H g H)&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
datatype &amp;#039;a arbol = H | N &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;N (N H c H) e (N H g H)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. 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 (N H c H) e (N H g H))&lt;br /&gt;
     = [e,c,g]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 = []&amp;quot;&lt;br /&gt;
 |&amp;quot;preOrden (N i x d) = x#(preOrden i @ preOrden d)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;preOrden (N (N H c H) e (N H g H)) = [e,c,g]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. 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 (N H c H) e (N H g H))&lt;br /&gt;
     = [c,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 = []&amp;quot;&lt;br /&gt;
 |&amp;quot;postOrden (N i x d) = (postOrden i) @ (postOrden d) @ [x]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;postOrden (N (N H c H) e (N H g H)) = [c,g,e]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Definir, usando un acumulador, la función &lt;br /&gt;
     postOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (postOrdenA a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     postOrdenA (N (N H c H) e (N H g H))&lt;br /&gt;
     = [c,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun postOrdenAaux :: &amp;quot;[&amp;#039;a arbol, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrdenAaux H xs = xs&amp;quot;&lt;br /&gt;
 |&amp;quot;postOrdenAaux (N i x d) xs = (postOrdenAaux i (postOrdenAaux d (x#xs)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition postOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrdenA a ≡ postOrdenAaux a []&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;postOrdenA (N (N H c H) e (N H g H)) = [c,g,e]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar que&lt;br /&gt;
     postOrdenAaux a xs = (postOrden a) @ xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrdenAaux a xs = (postOrden a) @ xs&amp;quot;&lt;br /&gt;
by (induct a arbitrary: xs, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función&lt;br /&gt;
     foldl_arbol :: &amp;quot;(&amp;#039;b =&amp;gt; &amp;#039;a =&amp;gt; &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a arbol ⇒ &amp;#039;b&amp;quot; where&lt;br /&gt;
  tal que (foldl_arbol f b a) es el plegado izquierdo del árbol a con la&lt;br /&gt;
  operación f y elemento inicial b.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun foldl_arbol :: &amp;quot;(&amp;#039;b =&amp;gt; &amp;#039;a =&amp;gt; &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a arbol ⇒ &amp;#039;b&amp;quot; where&lt;br /&gt;
  &amp;quot;foldl_arbol f b H = b&amp;quot;&lt;br /&gt;
 |&amp;quot;foldl_arbol f b (N i x d) = foldl_arbol f (foldl_arbol f (f b x) d) i&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar que&lt;br /&gt;
     postOrdenAaux t a = foldl_arbol (λ xs x. Cons x xs) a t&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrdenAaux t a = foldl_arbol (λ xs x. Cons x xs) a t&amp;quot;&lt;br /&gt;
by (induct t arbitrary: a, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función&lt;br /&gt;
     suma_arbol :: &amp;quot;nat arbol ⇒ nat&amp;quot; &lt;br /&gt;
  tal que (suma_arbol a) es la suma de los elementos del árbol de&lt;br /&gt;
  números naturales a.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun suma_arbol :: &amp;quot;nat arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma_arbol H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;suma_arbol (N i x d) = (suma_arbol i) + x + (suma_arbol d)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar que&lt;br /&gt;
     suma_arbol a = suma (preOrden a)&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;suma_arbol a = suma (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_11&amp;diff=267</id>
		<title>Relación 11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_11&amp;diff=267"/>
		<updated>2015-01-26T08:21:34Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R11: Plegados de listas y de árboles *}&lt;br /&gt;
 &lt;br /&gt;
theory R11&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
 &lt;br /&gt;
section {* Nuevas funciones sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  Nota. En esta relación se usará la función suma tal que (suma xs) es&lt;br /&gt;
  la suma de los elementos de xs, definida por&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Pedrosrei: corrijo, la definición que se pretendía era esta, debería&lt;br /&gt;
estar dada, es una errata. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun suma :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma [] = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;suma (x#xs) = x+suma xs&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  Las funciones de plegado, foldr y foldl, están definidas en la teoría&lt;br /&gt;
  List.thy por&lt;br /&gt;
       foldr :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b ⇒ &amp;#039;b&amp;quot;&lt;br /&gt;
       foldr f []       = id&lt;br /&gt;
       foldr f (x # xs) = f x ∘ foldr f xs&lt;br /&gt;
 &lt;br /&gt;
       foldl :: &amp;quot;(&amp;#039;b ⇒ &amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a list ⇒ &amp;#039;b&amp;quot;&lt;br /&gt;
       foldl f a []       = a&lt;br /&gt;
       foldl f a (x # xs) = foldl f (f a x) xs&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo,&lt;br /&gt;
     foldr (op +) [a,b,c] d        = a + (b + (c + d))&lt;br /&gt;
     foldl (op +) d [a,b,c]        = ((d + a) + b) + c&lt;br /&gt;
     foldr (op -) [9,4,2] (0::int) = 7&lt;br /&gt;
     foldl (op -) (0::int) [9,4,2] = -15&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;foldr (op +) [a,b,c] d&amp;quot;        -- &amp;quot;= a + (b + (c + d))&amp;quot;&lt;br /&gt;
value &amp;quot;foldl (op +) d [a,b,c]&amp;quot;        -- &amp;quot;= ((d + a) + b) + c&amp;quot;&lt;br /&gt;
value &amp;quot;foldr (op -) [9,4,2] (0::int)&amp;quot; -- &amp;quot;= 7&amp;quot;&lt;br /&gt;
value &amp;quot;foldl (op -) (0::int) [9,4,2]&amp;quot; -- &amp;quot;= -15&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar que&lt;br /&gt;
     suma xs = foldr (op +) xs 0&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma suma_foldr: &amp;quot;suma xs = foldr (op +) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
     length xs = foldr (λ x res. 1 + res) xs 0&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremarm,juacorvic&amp;quot;&lt;br /&gt;
lemma length_foldr: &amp;quot;length xs = foldr (λ x res. 1 + res) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. La aplicación repetida de foldr y map tiene el&lt;br /&gt;
  inconveniente de que la lista se recorre varias veces. Sin embargo, es&lt;br /&gt;
  suficiente recorrerla una vez como se muestra en el siguiente ejemplo,  &lt;br /&gt;
     suma (map (λx. x + 3) xs) = foldr h xs b&lt;br /&gt;
  Determinar los valores de h y b para que se verifique la igualdad&lt;br /&gt;
  anterior y demostrarla.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;suma (map (λx. x + 3) xs) = foldr (λ x y. x+y+3) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Generalizar el resultado anterior; es decir determinar&lt;br /&gt;
  los valores de h y b para que se verifique la igualdad &lt;br /&gt;
     foldr g (map f xs) a = foldr h xs b&lt;br /&gt;
  y demostrarla.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;foldr g (map f xs) a = foldr (g∘f) xs a&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. La siguiente función invierte una lista en tiempo lineal&lt;br /&gt;
     fun inversa_ac :: &amp;quot;[&amp;#039;a list, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;inversa_ac [] ys = ys&amp;quot;&lt;br /&gt;
     | &amp;quot;inversa_ac (x#xs) ys = (inversa_ac xs (x#ys))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     definition inversa_ac :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;inversa_ac xs ≡ inversa_ac_aux xs []&amp;quot;&lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     inversa_ac [a,d,b,c] = [c, b, d, a]&lt;br /&gt;
  Demostrar que inversa_ac se puede definir unsando foldl.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun inversa_ac_aux :: &amp;quot;[&amp;#039;a list, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa_ac_aux [] ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;inversa_ac_aux (x#xs) ys = (inversa_ac_aux xs (x#ys))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition inversa_ac :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa_ac xs ≡ inversa_ac_aux xs []&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;inversa_ac [a,d,b,c]&amp;quot; -- &amp;quot;= [c, b, d, a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma inversa_ac_aux_foldl: &lt;br /&gt;
  &amp;quot;inversa_ac_aux xs a = foldl (λ ys x. x#ys) a xs&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: a, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar la siguiente propiedad distributiva de la suma&lt;br /&gt;
  sobre la concatenación:&lt;br /&gt;
     suma (xs @ ys) = suma xs + suma ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma suma_append [simp]: &lt;br /&gt;
  &amp;quot;suma (xs @ ys) = suma xs + suma ys&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar una propiedad similar para foldr&lt;br /&gt;
     foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&lt;br /&gt;
  En este caso, hay que restringir el resultado teniendo en cuenta&lt;br /&gt;
  propiedades algebraicas de f y a.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei: Dales nombre a las cosas Jesús, te las nombro yo:&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma l1:&lt;br /&gt;
  assumes neutr: &amp;quot;(∀ x. (f a x = x))&amp;quot; and&lt;br /&gt;
          assoc: &amp;quot;(∀x y z. f (f x y) z = f x (f y z))&amp;quot;&lt;br /&gt;
  shows &amp;quot;foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;foldr f ([] @ ys) a = f (foldr f [] a) (foldr f ys a)&amp;quot;&lt;br /&gt;
    using neutr by simp&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀aa xs.&lt;br /&gt;
       foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a) ⟹&lt;br /&gt;
       foldr f ((aa # xs) @ ys) a = f (foldr f (aa # xs) a) (foldr f ys a)&amp;quot;&lt;br /&gt;
    using assoc by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob:&lt;br /&gt;
saco fuera las hipotesis porque se usan tambien en el ejercicio siguiente,&lt;br /&gt;
ademas la prueba queda mas corta *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition neutr :: &amp;quot;[&amp;#039;a ⇒ &amp;#039;b ⇒ &amp;#039;b, &amp;#039;a] ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;neutr f a == (∀ x. (f a x = x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition assoc :: &amp;quot;[&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a] ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;assoc f == (∀ x y z. f (f x y) z = f x (f y z))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Pedrosrei: esta es la versión automática del lema anterior, ¿para qué&lt;br /&gt;
 cambias el enunciado por uno equivalente? *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma l2: &amp;quot;⟦neutr f a ; assoc f⟧ &lt;br /&gt;
  ⟹ foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&amp;quot;&lt;br /&gt;
by (induct xs, simp add: neutr_def, simp add: assoc_def)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir, usando foldr, la función&lt;br /&gt;
     prod :: &amp;quot;nat list ⇒ nat&amp;quot;&lt;br /&gt;
  tal que (prod xs) es el producto de los elementos de xs. Por ejemplo,&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition prod :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;prod xs ≡ foldr (op *) xs 1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;prod [2::nat,3,5] = 30&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar directamente (es decir, sin inducción) que&lt;br /&gt;
     prod (xs @ ys) = prod xs * prod ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;prod (xs @ ys) = prod xs * prod ys&amp;quot;&lt;br /&gt;
by (simp only: prod_def, rule l2, simp add: neutr_def, simp add: assoc_def)&lt;br /&gt;
&lt;br /&gt;
section {* Functiones sobre árboles *}&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que tiene información sólo en los nodos. Por ejemplo,&lt;br /&gt;
  el árbol &lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H c H) e (N H g H)&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
datatype &amp;#039;a arbol = H | N &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;N (N H c H) e (N H g H)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. 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 (N H c H) e (N H g H))&lt;br /&gt;
     = [e,c,g]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 = []&amp;quot;&lt;br /&gt;
 |&amp;quot;preOrden (N i x d) = x#(preOrden i @ preOrden d)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;preOrden (N (N H c H) e (N H g H)) = [e,c,g]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. 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 (N H c H) e (N H g H))&lt;br /&gt;
     = [c,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 = []&amp;quot;&lt;br /&gt;
 |&amp;quot;postOrden (N i x d) = (postOrden i) @ (postOrden d) @ [x]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;postOrden (N (N H c H) e (N H g H)) = [c,g,e]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Definir, usando un acumulador, la función &lt;br /&gt;
     postOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (postOrdenA a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     postOrdenA (N (N H c H) e (N H g H))&lt;br /&gt;
     = [c,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun postOrdenAaux :: &amp;quot;[&amp;#039;a arbol, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrdenAaux H xs = xs&amp;quot;&lt;br /&gt;
 |&amp;quot;postOrdenAaux (N i x d) xs = (postOrdenAaux i (postOrdenAaux d (x#xs)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition postOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrdenA a ≡ postOrdenAaux a []&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;postOrdenA (N (N H c H) e (N H g H)) = [c,g,e]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar que&lt;br /&gt;
     postOrdenAaux a xs = (postOrden a) @ xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrdenAaux a xs = (postOrden a) @ xs&amp;quot;&lt;br /&gt;
by (induct a arbitrary: xs, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función&lt;br /&gt;
     foldl_arbol :: &amp;quot;(&amp;#039;b =&amp;gt; &amp;#039;a =&amp;gt; &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a arbol ⇒ &amp;#039;b&amp;quot; where&lt;br /&gt;
  tal que (foldl_arbol f b a) es el plegado izquierdo del árbol a con la&lt;br /&gt;
  operación f y elemento inicial b.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun foldl_arbol :: &amp;quot;(&amp;#039;b =&amp;gt; &amp;#039;a =&amp;gt; &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a arbol ⇒ &amp;#039;b&amp;quot; where&lt;br /&gt;
  &amp;quot;foldl_arbol f b H = b&amp;quot;&lt;br /&gt;
 |&amp;quot;foldl_arbol f b (N i x d) = foldl_arbol f (foldl_arbol f (f b x) d) i&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar que&lt;br /&gt;
     postOrdenAaux t a = foldl_arbol (λ xs x. Cons x xs) a t&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrdenAaux t a = foldl_arbol (λ xs x. Cons x xs) a t&amp;quot;&lt;br /&gt;
by (induct t arbitrary: a, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función&lt;br /&gt;
     suma_arbol :: &amp;quot;nat arbol ⇒ nat&amp;quot; &lt;br /&gt;
  tal que (suma_arbol a) es la suma de los elementos del árbol de&lt;br /&gt;
  números naturales a.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun suma_arbol :: &amp;quot;nat arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma_arbol H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;suma_arbol (N i x d) = (suma_arbol i) + x + (suma_arbol d)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar que&lt;br /&gt;
     suma_arbol a = suma (preOrden a)&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;suma_arbol a = suma (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_11&amp;diff=266</id>
		<title>Relación 11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_11&amp;diff=266"/>
		<updated>2015-01-26T08:03:47Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R11: Plegados de listas y de árboles *}&lt;br /&gt;
 &lt;br /&gt;
theory R11&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
 &lt;br /&gt;
section {* Nuevas funciones sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  Nota. En esta relación se usará la función suma tal que (suma xs) es&lt;br /&gt;
  la suma de los elementos de xs, definida por&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Pedrosrei: corrijo, la definición que se pretendía era esta, debería&lt;br /&gt;
estar dada, es una errata. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun suma :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma [] = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;suma (x#xs) = x+suma xs&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  Las funciones de plegado, foldr y foldl, están definidas en la teoría&lt;br /&gt;
  List.thy por&lt;br /&gt;
       foldr :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b ⇒ &amp;#039;b&amp;quot;&lt;br /&gt;
       foldr f []       = id&lt;br /&gt;
       foldr f (x # xs) = f x ∘ foldr f xs&lt;br /&gt;
 &lt;br /&gt;
       foldl :: &amp;quot;(&amp;#039;b ⇒ &amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a list ⇒ &amp;#039;b&amp;quot;&lt;br /&gt;
       foldl f a []       = a&lt;br /&gt;
       foldl f a (x # xs) = foldl f (f a x) xs&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo,&lt;br /&gt;
     foldr (op +) [a,b,c] d        = a + (b + (c + d))&lt;br /&gt;
     foldl (op +) d [a,b,c]        = ((d + a) + b) + c&lt;br /&gt;
     foldr (op -) [9,4,2] (0::int) = 7&lt;br /&gt;
     foldl (op -) (0::int) [9,4,2] = -15&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;foldr (op +) [a,b,c] d&amp;quot;        -- &amp;quot;= a + (b + (c + d))&amp;quot;&lt;br /&gt;
value &amp;quot;foldl (op +) d [a,b,c]&amp;quot;        -- &amp;quot;= ((d + a) + b) + c&amp;quot;&lt;br /&gt;
value &amp;quot;foldr (op -) [9,4,2] (0::int)&amp;quot; -- &amp;quot;= 7&amp;quot;&lt;br /&gt;
value &amp;quot;foldl (op -) (0::int) [9,4,2]&amp;quot; -- &amp;quot;= -15&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar que&lt;br /&gt;
     suma xs = foldr (op +) xs 0&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma suma_foldr: &amp;quot;suma xs = foldr (op +) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
     length xs = foldr (λ x res. 1 + res) xs 0&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma length_foldr: &amp;quot;length xs = foldr (λ x res. 1 + res) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. La aplicación repetida de foldr y map tiene el&lt;br /&gt;
  inconveniente de que la lista se recorre varias veces. Sin embargo, es&lt;br /&gt;
  suficiente recorrerla una vez como se muestra en el siguiente ejemplo,  &lt;br /&gt;
     suma (map (λx. x + 3) xs) = foldr h xs b&lt;br /&gt;
  Determinar los valores de h y b para que se verifique la igualdad&lt;br /&gt;
  anterior y demostrarla.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;suma (map (λx. x + 3) xs) = foldr (λ x y. x+y+3) xs 0&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Generalizar el resultado anterior; es decir determinar&lt;br /&gt;
  los valores de h y b para que se verifique la igualdad &lt;br /&gt;
     foldr g (map f xs) a = foldr h xs b&lt;br /&gt;
  y demostrarla.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;foldr g (map f xs) a = foldr (g∘f) xs a&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. La siguiente función invierte una lista en tiempo lineal&lt;br /&gt;
     fun inversa_ac :: &amp;quot;[&amp;#039;a list, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;inversa_ac [] ys = ys&amp;quot;&lt;br /&gt;
     | &amp;quot;inversa_ac (x#xs) ys = (inversa_ac xs (x#ys))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     definition inversa_ac :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;inversa_ac xs ≡ inversa_ac_aux xs []&amp;quot;&lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     inversa_ac [a,d,b,c] = [c, b, d, a]&lt;br /&gt;
  Demostrar que inversa_ac se puede definir unsando foldl.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun inversa_ac_aux :: &amp;quot;[&amp;#039;a list, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa_ac_aux [] ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;inversa_ac_aux (x#xs) ys = (inversa_ac_aux xs (x#ys))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition inversa_ac :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa_ac xs ≡ inversa_ac_aux xs []&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;inversa_ac [a,d,b,c]&amp;quot; -- &amp;quot;= [c, b, d, a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma inversa_ac_aux_foldl: &lt;br /&gt;
  &amp;quot;inversa_ac_aux xs a = foldl (λ ys x. x#ys) a xs&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: a, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar la siguiente propiedad distributiva de la suma&lt;br /&gt;
  sobre la concatenación:&lt;br /&gt;
     suma (xs @ ys) = suma xs + suma ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma suma_append [simp]: &lt;br /&gt;
  &amp;quot;suma (xs @ ys) = suma xs + suma ys&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar una propiedad similar para foldr&lt;br /&gt;
     foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&lt;br /&gt;
  En este caso, hay que restringir el resultado teniendo en cuenta&lt;br /&gt;
  propiedades algebraicas de f y a.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei: Dales nombre a las cosas Jesús, te las nombro yo:&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma l1:&lt;br /&gt;
  assumes neutr: &amp;quot;(∀ x. (f a x = x))&amp;quot; and&lt;br /&gt;
          assoc: &amp;quot;(∀x y z. f (f x y) z = f x (f y z))&amp;quot;&lt;br /&gt;
  shows &amp;quot;foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;foldr f ([] @ ys) a = f (foldr f [] a) (foldr f ys a)&amp;quot;&lt;br /&gt;
    using neutr by simp&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀aa xs.&lt;br /&gt;
       foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a) ⟹&lt;br /&gt;
       foldr f ((aa # xs) @ ys) a = f (foldr f (aa # xs) a) (foldr f ys a)&amp;quot;&lt;br /&gt;
    using assoc by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob:&lt;br /&gt;
saco fuera las hipotesis porque se usan tambien en el ejercicio siguiente,&lt;br /&gt;
ademas la prueba queda mas corta *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition neutr :: &amp;quot;[&amp;#039;a ⇒ &amp;#039;b ⇒ &amp;#039;b, &amp;#039;a] ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;neutr f a == (∀ x. (f a x = x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition assoc :: &amp;quot;[&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a] ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;assoc f == (∀ x y z. f (f x y) z = f x (f y z))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Pedrosrei: esta es la versión automática del lema anterior, ¿para qué&lt;br /&gt;
 cambias el enunciado por uno equivalente? *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma l2: &amp;quot;⟦neutr f a ; assoc f⟧ &lt;br /&gt;
  ⟹ foldr f (xs @ ys) a = f (foldr f xs a) (foldr f ys a)&amp;quot;&lt;br /&gt;
by (induct xs, simp add: neutr_def, simp add: assoc_def)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir, usando foldr, la función&lt;br /&gt;
     prod :: &amp;quot;nat list ⇒ nat&amp;quot;&lt;br /&gt;
  tal que (prod xs) es el producto de los elementos de xs. Por ejemplo,&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition prod :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;prod xs ≡ foldr (op *) xs 1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;prod [2::nat,3,5] = 30&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar directamente (es decir, sin inducción) que&lt;br /&gt;
     prod (xs @ ys) = prod xs * prod ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;prod (xs @ ys) = prod xs * prod ys&amp;quot;&lt;br /&gt;
by (simp only: prod_def, rule l2, simp add: neutr_def, simp add: assoc_def)&lt;br /&gt;
&lt;br /&gt;
section {* Functiones sobre árboles *}&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que tiene información sólo en los nodos. Por ejemplo,&lt;br /&gt;
  el árbol &lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H c H) e (N H g H)&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
datatype &amp;#039;a arbol = H | N &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;N (N H c H) e (N H g H)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. 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 (N H c H) e (N H g H))&lt;br /&gt;
     = [e,c,g]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 = []&amp;quot;&lt;br /&gt;
 |&amp;quot;preOrden (N i x d) = x#(preOrden i @ preOrden d)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;preOrden (N (N H c H) e (N H g H)) = [e,c,g]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. 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 (N H c H) e (N H g H))&lt;br /&gt;
     = [c,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 = []&amp;quot;&lt;br /&gt;
 |&amp;quot;postOrden (N i x d) = (postOrden i) @ (postOrden d) @ [x]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;postOrden (N (N H c H) e (N H g H)) = [c,g,e]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Definir, usando un acumulador, la función &lt;br /&gt;
     postOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (postOrdenA a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     postOrdenA (N (N H c H) e (N H g H))&lt;br /&gt;
     = [c,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun postOrdenAaux :: &amp;quot;[&amp;#039;a arbol, &amp;#039;a list] ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrdenAaux H xs = xs&amp;quot;&lt;br /&gt;
 |&amp;quot;postOrdenAaux (N i x d) xs = (postOrdenAaux i (postOrdenAaux d (x#xs)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
definition postOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrdenA a ≡ postOrdenAaux a []&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;postOrdenA (N (N H c H) e (N H g H)) = [c,g,e]&amp;quot; -- &amp;quot;True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar que&lt;br /&gt;
     postOrdenAaux a xs = (postOrden a) @ xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrdenAaux a xs = (postOrden a) @ xs&amp;quot;&lt;br /&gt;
by (induct a arbitrary: xs, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función&lt;br /&gt;
     foldl_arbol :: &amp;quot;(&amp;#039;b =&amp;gt; &amp;#039;a =&amp;gt; &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a arbol ⇒ &amp;#039;b&amp;quot; where&lt;br /&gt;
  tal que (foldl_arbol f b a) es el plegado izquierdo del árbol a con la&lt;br /&gt;
  operación f y elemento inicial b.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun foldl_arbol :: &amp;quot;(&amp;#039;b =&amp;gt; &amp;#039;a =&amp;gt; &amp;#039;b) ⇒ &amp;#039;b ⇒ &amp;#039;a arbol ⇒ &amp;#039;b&amp;quot; where&lt;br /&gt;
  &amp;quot;foldl_arbol f b H = b&amp;quot;&lt;br /&gt;
 |&amp;quot;foldl_arbol f b (N i x d) = foldl_arbol f (foldl_arbol f (f b x) d) i&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar que&lt;br /&gt;
     postOrdenAaux t a = foldl_arbol (λ xs x. Cons x xs) a t&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrdenAaux t a = foldl_arbol (λ xs x. Cons x xs) a t&amp;quot;&lt;br /&gt;
by (induct t arbitrary: a, simp_all)&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función&lt;br /&gt;
     suma_arbol :: &amp;quot;nat arbol ⇒ nat&amp;quot; &lt;br /&gt;
  tal que (suma_arbol a) es la suma de los elementos del árbol de&lt;br /&gt;
  números naturales a.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun suma_arbol :: &amp;quot;nat arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma_arbol H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;suma_arbol (N i x d) = (suma_arbol i) + x + (suma_arbol d)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar que&lt;br /&gt;
     suma_arbol a = suma (preOrden a)&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;suma_arbol a = suma (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=235</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=235"/>
		<updated>2014-12-18T08:26:42Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R8: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Arboles_binarios_completos&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 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)&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;
&lt;br /&gt;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom, carvelcab, juacorvic&amp;quot;&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 i d) = hojas i + hojas d&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun max :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;max a b= (if a≥ b then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;max 6 3&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, carvelcab, juacorvic&amp;quot;&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 a b) = 1 + max (profundidad a) (profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Explico estas dos funciones, la que utilizo para los &lt;br /&gt;
  lemas de abajo es profundidad ya que profundidad1 me encuentra&lt;br /&gt;
  contraejemplos y para evitar eso busque definir profundidad&lt;br /&gt;
  definidad de manera distinta. No obstante la que a mi me parece&lt;br /&gt;
  mas sensata para definir la profundidad de un árbol es la &lt;br /&gt;
  profundidad1 *)&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Fallo mio ya lo corregí*)&lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: La profundidad correcta es la mayor. Si te encuentra&lt;br /&gt;
 contraejemplos más adelante es que te has equivocado en los&lt;br /&gt;
 enunciados. Las funciones máximo y mínimo vienen predefinidas&lt;br /&gt;
 ya sin necesidad de definirlas. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
fun pr1 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;pr1 H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;pr1 (N i d) = Suc(max (pr1 i) (pr1 d))&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom,carvelcab, juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot; (*¿Pudiera ser que esta sea más rápida?*)&lt;br /&gt;
fun abc1 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc1 0 = H&amp;quot;&lt;br /&gt;
 |&amp;quot;abc1 (Suc n) = (let a = abc1 n in N a a)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&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 a b) = ((f a = f b) ∧ (es_abc f a ∧ es_abc f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom, carvelcab&amp;quot;&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;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun es_abc3 :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc3 f H = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc3 f (N i d) = ( es_abc3 f i ∧ es_abc3 f d ∧ f i = f d )&amp;quot;&lt;br /&gt;
&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;
text{*Para entenderme he cambiado de función de tamaño, la demostración&lt;br /&gt;
es análoga pero buscando las simplificaciones de size cuando correspondan&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun nodos::&amp;quot;arbol ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;nodos H = 0&amp;quot;&lt;br /&gt;
|&amp;quot;nodos (N i d) = 1+(nodos i)+(nodos d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;size t= nodos t&amp;quot;&lt;br /&gt;
apply (induct t, auto)done&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
value &amp;quot;size (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;
  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;
&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;
text{*Pedrosrei: Los enunciados y demostraciones que vienen a continuación &lt;br /&gt;
son feos y engorrosos. Yo he optado por demostrarlo todo a través de &lt;br /&gt;
una propiedad extraña a la demostración en principio. Animo encarecidamente&lt;br /&gt;
a que pongáis una demostración más corta y directa. Voy explicando paso&lt;br /&gt;
a paso qué he hecho en cada momento. Hecha esta demostración, el resto&lt;br /&gt;
son triviales por una cadena de resultados. &lt;br /&gt;
 No existe relación de implicación en ningún sentido &lt;br /&gt;
 entre hojas y profundidad, como es obvio y muestran los siguientes&lt;br /&gt;
 contraejemplos: *}&lt;br /&gt;
lemma &amp;quot;(((hojas(t1) = hojas(t2)))--&amp;gt;(profundidad(t1) = profundidad(t2)))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) --&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) &amp;lt;-&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {* Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
t1 = N (N H H) (N H H)&lt;br /&gt;
t2 = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
hojas t1 = 4&lt;br /&gt;
hojas t2 = 3&lt;br /&gt;
&lt;br /&gt;
Ahora pongo una serie de resultados auxiliares que ayudarán en la prueba&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
lemma auxprof:&amp;quot;(es_abc profundidad t)∧(profundidad t = n)==&amp;gt; (t= abc n)&amp;quot;&lt;br /&gt;
apply (induct t arbitrary:n, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma eq_1_iff_exp_0:&amp;quot;Suc 0 = 2 ^ n &amp;lt;-&amp;gt; n=0&amp;quot;  apply (cases n, auto) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhojas:&amp;quot;(t= abc n)==&amp;gt; (es_abc hojas t)&amp;quot;&lt;br /&gt;
apply (induct n arbitrary: t, auto simp add: eq_1_iff_exp_0) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhoja:&amp;quot;(t= abc n)==&amp;gt;((hojas t = 2^n))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Y aquí viene la demostración larga y fea que os animo a mejorar.&lt;br /&gt;
He dejado los pasos exactamente que indica el razonador para que &lt;br /&gt;
veáis qué hace en cada caso:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_hoja:&amp;quot;es_abc profundidad t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc hojas t&amp;quot; using auxhojas by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc hojas t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
       hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
         es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
         hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc hojas t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
           hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc hojas t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;hojas t1 = hojas t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc hojas t1&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t1 = (2::nat)^n&amp;quot; using 2 auxhoja by auto&lt;br /&gt;
               hence 3:&amp;quot;hojas t2 =  (2::nat)^n&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc hojas t2&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t2 =  (2::nat)^m&amp;quot; using 5 auxhoja by auto&lt;br /&gt;
               with 3 have &amp;quot; (2::nat)^m =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; apply (induct, auto)done&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: creo que tengo una demostración mas elegante tan&lt;br /&gt;
sólo hace falta encontrar la relacion entre hojas y profundidad*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma a1: &lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = 2^(pr1 a)&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma cpr1_chojas: &amp;quot;es_abc pr1 a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: esta la detallada*)&lt;br /&gt;
--&amp;quot;jeshorcob,caarvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc hojas 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc pr1 (N i d) = &lt;br /&gt;
    (pr1 i = pr1 d ∧ es_abc pr1 i ∧ es_abc pr1 d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (pr1 i = pr1 d ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d &lt;br /&gt;
      ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot; using a1 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc hojas (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;domcadgom&amp;quot;&lt;br /&gt;
lemma aux1: &amp;quot;(es_abc profundidad a) ⟹ (hojas a) =  (2^(profundidad  a))&amp;quot;&lt;br /&gt;
by (induct a,simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo1: &amp;quot;(es_abc (profundidad) a) = (es_abc (hojas) a)&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
  fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc profundidad a1 = es_abc hojas a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc profundidad a2 = es_abc hojas a2&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc profundidad a2 ∧ es_abc profundidad a1 ⟶ es_abc profundidad &lt;br /&gt;
(N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; using a1 a2 by (simp add: aux1)&lt;br /&gt;
  thus &amp;quot;es_abc profundidad (N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed&lt;br /&gt;
&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;
(* Javrodviv1: Bueno yo para este ejercicio he encontrado algo mas sencillo,&lt;br /&gt;
    tan solo hay que encontrar una relación de igualdad entre hojas y size,&lt;br /&gt;
    que para este caso es sencillo.*)&lt;br /&gt;
-- &amp;quot;Javrodviv1,carvelcab&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma hojasize_igualdad: &lt;br /&gt;
      &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
by (induct x, simp_all)&lt;br /&gt;
&lt;br /&gt;
(*lemma &amp;quot;es_abc size a &amp;lt;-&amp;gt; es_abc hojas a&amp;quot; Son equivalentes = es lo mismo que &amp;lt;-&amp;gt; &lt;br /&gt;
    matemáticamente hablando*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot; es_abc size a = es_abc hojas a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
by (induct a, simp_all add: hojasize_igualdad)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Aquí dejo esta. Es trivial debido a la demostración anterior,&lt;br /&gt;
sólo hace falta coger el mismo desvío. Aquí sí que podéis encontrar&lt;br /&gt;
una mucho más directa: *}&lt;br /&gt;
&lt;br /&gt;
lemma auxnodo:&amp;quot;(t= abc n)==&amp;gt;(es_abc nodos t)∧(nodos t = (2^n - 1))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma nodos_eq_hoja:&amp;quot;es_abc nodos t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof -&lt;br /&gt;
have 1:&amp;quot;es_abc hojas t &amp;lt;-&amp;gt; es_abc profundidad t&amp;quot; using prof_eq_hoja by auto&lt;br /&gt;
hence 2:&amp;quot;?P t = (es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot; by auto&lt;br /&gt;
have &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
with 1 2 show ?thesis by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: aquí similar*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma a2: &lt;br /&gt;
  assumes &amp;quot;es_abc size a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma chojas_cnodos: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a2)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc hojas a = es_abc size 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc hojas (N i d) = &lt;br /&gt;
    (hojas i = hojas d ∧ es_abc hojas i ∧ es_abc hojas d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d ∧ es_abc size i ∧ es_abc size d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (size i = size d &lt;br /&gt;
      ∧ es_abc size i ∧ es_abc size d)&amp;quot; using a2 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc size (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma aux2: &amp;quot;(es_abc size a) ⟹ ((hojas a) = ((size a) +1))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo2: &amp;quot;es_abc hojas a = es_abc (size) a&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
 fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc hojas a1 = es_abc size a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc hojas a2 = es_abc size a2&amp;quot;&lt;br /&gt;
  hence &amp;quot;es_abc size a2 ∧ es_abc size a1 ⟶ &lt;br /&gt;
es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; using a1 by (simp add: aux2)&lt;br /&gt;
  thus &amp;quot;es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* numero de hojas es size + 1 *)&lt;br /&gt;
lemma l_hojas_size: &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
show &amp;quot; hojas H = size H + 1&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
fix x1 x2&lt;br /&gt;
assume h1:&amp;quot;hojas x1 = size x1 + 1&amp;quot;&lt;br /&gt;
assume h2:&amp;quot;hojas x2 = size x2 + 1&amp;quot;&lt;br /&gt;
have &amp;quot;hojas (N x1 x2) =  hojas x1 + hojas x2&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size x1 + 1 + size x2 + 1&amp;quot; using h1 h2 by simp&lt;br /&gt;
also have &amp;quot;... =  (1 + size x1 + size x2) + 1&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size (N x1 x2) + 1&amp;quot; by simp&lt;br /&gt;
finally show  &amp;quot;hojas (N x1 x2) = size (N x1 x2) + 1&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* usando lema anterior *)&lt;br /&gt;
lemma rel_size_igualdad: &amp;quot; es_abc size  a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: l_hojas_size)&lt;br /&gt;
&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;
text {* Pedrosrei. De hecho, esta es una parte de la anterior: *}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_nodos: &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: sale directo como corolario de los anteriores*)&lt;br /&gt;
--&amp;quot;jeshorcob,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc size a&amp;quot;&lt;br /&gt;
using cpr1_chojas and chojas_cnodos by simp_all&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary completo3: &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
 using completo1 completo2 by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*&lt;br /&gt;
1.- En apartado 7 se demuestra que:&lt;br /&gt;
  es_abc profundidad a ⟷ es_abc hojas a&lt;br /&gt;
2.- En apartado 8 se demuestra que:&lt;br /&gt;
                           es_abc hojas a ⟷ es_abc size  a &lt;br /&gt;
3.- Luego podremos demostrar usando las anteriores:&lt;br /&gt;
    es_abc profundidad a ⟷ es_abc size  a &lt;br /&gt;
&lt;br /&gt;
Nota: Aplico demostración de &amp;quot;domcadgom&amp;quot; de apartado 7, que&lt;br /&gt;
no he conseguido reproducir *) &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
using completo1 rel_size_igualdad by simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot; es_abc f (abc n)&amp;quot;&lt;br /&gt;
apply (induct n, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom,carvelcab,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &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 n assume h: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (f (abc n) = f (abc n) ∧ &lt;br /&gt;
    es_abc f (abc n) ∧ es_abc f (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using h by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* Más detallada *)&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot; es_abc f (abc 0)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n &lt;br /&gt;
  assume h1: &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (es_abc f (abc n) ∧ es_abc f (abc n) ∧ &lt;br /&gt;
          ( f (abc n) = f (abc n)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ( f (abc n) = f (abc n) )&amp;quot; using h1 by simp&lt;br /&gt;
  also have &amp;quot;... = True &amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;es_abc f (abc n) ⟹ es_abc f (abc (Suc n))&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 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ==&amp;gt; (a= abc (profundidad a))&amp;quot;&lt;br /&gt;
apply (induct a, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a ⟹ (a = abc (pr1 a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟹ (a = abc (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a  ⟹ a = abc (profundidad a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc nodos&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {*&lt;br /&gt;
El contraejemplo no es más que una medida constante, la trivial:&lt;br /&gt;
&lt;br /&gt;
Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇣1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc R8_Arboles_binarios_completos.size x = False&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: usando size en lugar de nodos, se encuentra el&lt;br /&gt;
mismo contraejemplo*)&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc size&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(*&lt;br /&gt;
el contraejemplo es:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇩1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc size x = False&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f t = es_abc size t&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun medida :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;medida H = 0&amp;quot;&lt;br /&gt;
|  &amp;quot;medida (N i d) = 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;es_abc medida a = es_abc size a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Contraejemplo&lt;br /&gt;
value &amp;quot;es_abc medida (N H (N H H))&amp;quot; (*devuelve true*)&lt;br /&gt;
value &amp;quot;es_abc size (N H (N H H))&amp;quot;   (*devuelve false*)&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=234</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=234"/>
		<updated>2014-12-18T08:25:26Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R8: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Arboles_binarios_completos&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 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)&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;
&lt;br /&gt;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom, carvelcab, juacorvic&amp;quot;&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 i d) = hojas i + hojas d&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun max :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;max a b= (if a≥ b then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;max 6 3&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, carvelcab, juacorvic&amp;quot;&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 a b) = 1 + max (profundidad a) (profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Explico estas dos funciones, la que utilizo para los &lt;br /&gt;
  lemas de abajo es profundidad ya que profundidad1 me encuentra&lt;br /&gt;
  contraejemplos y para evitar eso busque definir profundidad&lt;br /&gt;
  definidad de manera distinta. No obstante la que a mi me parece&lt;br /&gt;
  mas sensata para definir la profundidad de un árbol es la &lt;br /&gt;
  profundidad1 *)&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Fallo mio ya lo corregí*)&lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: La profundidad correcta es la mayor. Si te encuentra&lt;br /&gt;
 contraejemplos más adelante es que te has equivocado en los&lt;br /&gt;
 enunciados. Las funciones máximo y mínimo vienen predefinidas&lt;br /&gt;
 ya sin necesidad de definirlas. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
fun pr1 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;pr1 H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;pr1 (N i d) = Suc(max (pr1 i) (pr1 d))&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom,carvelcab, juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot; (*¿Pudiera ser que esta sea más rápida?*)&lt;br /&gt;
fun abc1 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc1 0 = H&amp;quot;&lt;br /&gt;
 |&amp;quot;abc1 (Suc n) = (let a = abc1 n in N a a)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&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 a b) = ((f a = f b) ∧ (es_abc f a ∧ es_abc f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom, carvelcab&amp;quot;&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;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun es_abc3 :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc3 f H = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc3 f (N i d) = ( es_abc3 f i ∧ es_abc3 f d ∧ f i = f d )&amp;quot;&lt;br /&gt;
&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;
text{*Para entenderme he cambiado de función de tamaño, la demostración&lt;br /&gt;
es análoga pero buscando las simplificaciones de size cuando correspondan&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun nodos::&amp;quot;arbol ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;nodos H = 0&amp;quot;&lt;br /&gt;
|&amp;quot;nodos (N i d) = 1+(nodos i)+(nodos d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;size t= nodos t&amp;quot;&lt;br /&gt;
apply (induct t, auto)done&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
value &amp;quot;size (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;
  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;
&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;
text{*Pedrosrei: Los enunciados y demostraciones que vienen a continuación &lt;br /&gt;
son feos y engorrosos. Yo he optado por demostrarlo todo a través de &lt;br /&gt;
una propiedad extraña a la demostración en principio. Animo encarecidamente&lt;br /&gt;
a que pongáis una demostración más corta y directa. Voy explicando paso&lt;br /&gt;
a paso qué he hecho en cada momento. Hecha esta demostración, el resto&lt;br /&gt;
son triviales por una cadena de resultados. &lt;br /&gt;
 No existe relación de implicación en ningún sentido &lt;br /&gt;
 entre hojas y profundidad, como es obvio y muestran los siguientes&lt;br /&gt;
 contraejemplos: *}&lt;br /&gt;
lemma &amp;quot;(((hojas(t1) = hojas(t2)))--&amp;gt;(profundidad(t1) = profundidad(t2)))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) --&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) &amp;lt;-&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {* Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
t1 = N (N H H) (N H H)&lt;br /&gt;
t2 = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
hojas t1 = 4&lt;br /&gt;
hojas t2 = 3&lt;br /&gt;
&lt;br /&gt;
Ahora pongo una serie de resultados auxiliares que ayudarán en la prueba&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
lemma auxprof:&amp;quot;(es_abc profundidad t)∧(profundidad t = n)==&amp;gt; (t= abc n)&amp;quot;&lt;br /&gt;
apply (induct t arbitrary:n, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma eq_1_iff_exp_0:&amp;quot;Suc 0 = 2 ^ n &amp;lt;-&amp;gt; n=0&amp;quot;  apply (cases n, auto) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhojas:&amp;quot;(t= abc n)==&amp;gt; (es_abc hojas t)&amp;quot;&lt;br /&gt;
apply (induct n arbitrary: t, auto simp add: eq_1_iff_exp_0) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhoja:&amp;quot;(t= abc n)==&amp;gt;((hojas t = 2^n))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Y aquí viene la demostración larga y fea que os animo a mejorar.&lt;br /&gt;
He dejado los pasos exactamente que indica el razonador para que &lt;br /&gt;
veáis qué hace en cada caso:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_hoja:&amp;quot;es_abc profundidad t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc hojas t&amp;quot; using auxhojas by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc hojas t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
       hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
         es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
         hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc hojas t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
           hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc hojas t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;hojas t1 = hojas t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc hojas t1&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t1 = (2::nat)^n&amp;quot; using 2 auxhoja by auto&lt;br /&gt;
               hence 3:&amp;quot;hojas t2 =  (2::nat)^n&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc hojas t2&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t2 =  (2::nat)^m&amp;quot; using 5 auxhoja by auto&lt;br /&gt;
               with 3 have &amp;quot; (2::nat)^m =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; apply (induct, auto)done&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: creo que tengo una demostración mas elegante tan&lt;br /&gt;
sólo hace falta encontrar la relacion entre hojas y profundidad*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma a1: &lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = 2^(pr1 a)&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma cpr1_chojas: &amp;quot;es_abc pr1 a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: esta la detallada*)&lt;br /&gt;
--&amp;quot;jeshorcob,caarvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc hojas 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc pr1 (N i d) = &lt;br /&gt;
    (pr1 i = pr1 d ∧ es_abc pr1 i ∧ es_abc pr1 d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (pr1 i = pr1 d ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d &lt;br /&gt;
      ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot; using a1 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc hojas (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;domcadgom&amp;quot;&lt;br /&gt;
lemma aux1: &amp;quot;(es_abc profundidad a) ⟹ (hojas a) =  (2^(profundidad  a))&amp;quot;&lt;br /&gt;
by (induct a,simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo1: &amp;quot;(es_abc (profundidad) a) = (es_abc (hojas) a)&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
  fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc profundidad a1 = es_abc hojas a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc profundidad a2 = es_abc hojas a2&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc profundidad a2 ∧ es_abc profundidad a1 ⟶ es_abc profundidad &lt;br /&gt;
(N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; using a1 a2 by (simp add: aux1)&lt;br /&gt;
  thus &amp;quot;es_abc profundidad (N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed&lt;br /&gt;
&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;
(* Javrodviv1: Bueno yo para este ejercicio he encontrado algo mas sencillo,&lt;br /&gt;
    tan solo hay que encontrar una relación de igualdad entre hojas y size,&lt;br /&gt;
    que para este caso es sencillo.*)&lt;br /&gt;
-- &amp;quot;Javrodviv1,carvelcab&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma hojasize_igualdad: &lt;br /&gt;
      &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
by (induct x, simp_all)&lt;br /&gt;
&lt;br /&gt;
(*lemma &amp;quot;es_abc size a &amp;lt;-&amp;gt; es_abc hojas a&amp;quot; Son equivalentes = es lo mismo que &amp;lt;-&amp;gt; &lt;br /&gt;
    matemáticamente hablando*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot; es_abc size a = es_abc hojas a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
by (induct a, simp_all add: hojasize_igualdad)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Aquí dejo esta. Es trivial debido a la demostración anterior,&lt;br /&gt;
sólo hace falta coger el mismo desvío. Aquí sí que podéis encontrar&lt;br /&gt;
una mucho más directa: *}&lt;br /&gt;
&lt;br /&gt;
lemma auxnodo:&amp;quot;(t= abc n)==&amp;gt;(es_abc nodos t)∧(nodos t = (2^n - 1))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma nodos_eq_hoja:&amp;quot;es_abc nodos t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof -&lt;br /&gt;
have 1:&amp;quot;es_abc hojas t &amp;lt;-&amp;gt; es_abc profundidad t&amp;quot; using prof_eq_hoja by auto&lt;br /&gt;
hence 2:&amp;quot;?P t = (es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot; by auto&lt;br /&gt;
have &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
with 1 2 show ?thesis by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: aquí similar*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma a2: &lt;br /&gt;
  assumes &amp;quot;es_abc size a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma chojas_cnodos: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a2)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc hojas a = es_abc size 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc hojas (N i d) = &lt;br /&gt;
    (hojas i = hojas d ∧ es_abc hojas i ∧ es_abc hojas d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d ∧ es_abc size i ∧ es_abc size d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (size i = size d &lt;br /&gt;
      ∧ es_abc size i ∧ es_abc size d)&amp;quot; using a2 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc size (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma aux2: &amp;quot;(es_abc size a) ⟹ ((hojas a) = ((size a) +1))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo2: &amp;quot;es_abc hojas a = es_abc (size) a&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
 fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc hojas a1 = es_abc size a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc hojas a2 = es_abc size a2&amp;quot;&lt;br /&gt;
  hence &amp;quot;es_abc size a2 ∧ es_abc size a1 ⟶ &lt;br /&gt;
es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; using a1 by (simp add: aux2)&lt;br /&gt;
  thus &amp;quot;es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* numero de hojas es size + 1 *)&lt;br /&gt;
lemma l_hojas_size: &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
show &amp;quot; hojas H = size H + 1&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
fix x1 x2&lt;br /&gt;
assume h1:&amp;quot;hojas x1 = size x1 + 1&amp;quot;&lt;br /&gt;
assume h2:&amp;quot;hojas x2 = size x2 + 1&amp;quot;&lt;br /&gt;
have &amp;quot;hojas (N x1 x2) =  hojas x1 + hojas x2&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size x1 + 1 + size x2 + 1&amp;quot; using h1 h2 by simp&lt;br /&gt;
also have &amp;quot;... =  (1 + size x1 + size x2) + 1&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size (N x1 x2) + 1&amp;quot; by simp&lt;br /&gt;
finally show  &amp;quot;hojas (N x1 x2) = size (N x1 x2) + 1&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* usando lema anterior *)&lt;br /&gt;
lemma rel_size_igualdad: &amp;quot; es_abc size  a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: l_hojas_size)&lt;br /&gt;
&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;
text {* Pedrosrei. De hecho, esta es una parte de la anterior: *}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_nodos: &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: sale directo como corolario de los anteriores*)&lt;br /&gt;
--&amp;quot;jeshorcob,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc size a&amp;quot;&lt;br /&gt;
using cpr1_chojas and chojas_cnodos by simp_all&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary completo3: &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
 using completo1 completo2 by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*&lt;br /&gt;
1.- En apartado 7 se demuestra que:&lt;br /&gt;
  es_abc profundidad a ⟷ es_abc hojas a&lt;br /&gt;
2.- En apartado 8 se demuestra que:&lt;br /&gt;
                           es_abc hojas a ⟷ es_abc size  a &lt;br /&gt;
3.- Luego podremos demostrar usando las anteriores:&lt;br /&gt;
    es_abc profundidad a ⟷ es_abc size  a &lt;br /&gt;
&lt;br /&gt;
Nota: Aplico demostración de &amp;quot;domcadgom&amp;quot; de apartado 7, que&lt;br /&gt;
no he conseguido reproducir *) &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
using completo1 rel_size_igualdad by simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot; es_abc f (abc n)&amp;quot;&lt;br /&gt;
apply (induct n, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom,carvelcab,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &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 n assume h: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (f (abc n) = f (abc n) ∧ &lt;br /&gt;
    es_abc f (abc n) ∧ es_abc f (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using h by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* Más detallada *)&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot; es_abc f (abc 0)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n &lt;br /&gt;
  assume h1: &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (es_abc f (abc n) ∧ es_abc f (abc n) ∧ &lt;br /&gt;
          ( f (abc n) = f (abc n)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ( f (abc n) = f (abc n) )&amp;quot; using h1 by simp&lt;br /&gt;
  also have &amp;quot;... = True &amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;es_abc f (abc n) ⟹ es_abc f (abc (Suc n))&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 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ==&amp;gt; (a= abc (profundidad a))&amp;quot;&lt;br /&gt;
apply (induct a, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a ⟹ (a = abc (pr1 a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟹ (a = abc (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a  ⟹ a = abc (profundidad a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc nodos&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {*&lt;br /&gt;
El contraejemplo no es más que una medida constante, la trivial:&lt;br /&gt;
&lt;br /&gt;
Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇣1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc R8_Arboles_binarios_completos.size x = False&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: usando size en lugar de nodos, se encuentra el&lt;br /&gt;
mismo contraejemplo*)&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc size&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(*&lt;br /&gt;
el contraejemplo es:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇩1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc size x = False&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f t = es_abc size t&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun medida :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;medida H = 0&amp;quot;&lt;br /&gt;
|  &amp;quot;medida (N i d) = 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;es_abc medida a = es_abc size a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
&lt;br /&gt;
(*Contraejemplo&lt;br /&gt;
value &amp;quot;es_abc medida (N H (N H H))&amp;quot; (*devuelve true*)&lt;br /&gt;
value &amp;quot;es_abc size (N H (N H H))&amp;quot;   (*devuelve false*)&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=233</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=233"/>
		<updated>2014-12-18T08:18:58Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R8: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Arboles_binarios_completos&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 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)&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;
&lt;br /&gt;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom, carvelcab, juacorvic&amp;quot;&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 i d) = hojas i + hojas d&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun max :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;max a b= (if a≥ b then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;max 6 3&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, carvelcab, juacorvic&amp;quot;&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 a b) = 1 + max (profundidad a) (profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Explico estas dos funciones, la que utilizo para los &lt;br /&gt;
  lemas de abajo es profundidad ya que profundidad1 me encuentra&lt;br /&gt;
  contraejemplos y para evitar eso busque definir profundidad&lt;br /&gt;
  definidad de manera distinta. No obstante la que a mi me parece&lt;br /&gt;
  mas sensata para definir la profundidad de un árbol es la &lt;br /&gt;
  profundidad1 *)&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Fallo mio ya lo corregí*)&lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: La profundidad correcta es la mayor. Si te encuentra&lt;br /&gt;
 contraejemplos más adelante es que te has equivocado en los&lt;br /&gt;
 enunciados. Las funciones máximo y mínimo vienen predefinidas&lt;br /&gt;
 ya sin necesidad de definirlas. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
fun pr1 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;pr1 H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;pr1 (N i d) = Suc(max (pr1 i) (pr1 d))&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom,carvelcab, juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot; (*¿Pudiera ser que esta sea más rápida?*)&lt;br /&gt;
fun abc1 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc1 0 = H&amp;quot;&lt;br /&gt;
 |&amp;quot;abc1 (Suc n) = (let a = abc1 n in N a a)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&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 a b) = ((f a = f b) ∧ (es_abc f a ∧ es_abc f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom, carvelcab&amp;quot;&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;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun es_abc3 :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc3 f H = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc3 f (N i d) = ( es_abc3 f i ∧ es_abc3 f d ∧ f i = f d )&amp;quot;&lt;br /&gt;
&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;
text{*Para entenderme he cambiado de función de tamaño, la demostración&lt;br /&gt;
es análoga pero buscando las simplificaciones de size cuando correspondan&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun nodos::&amp;quot;arbol ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;nodos H = 0&amp;quot;&lt;br /&gt;
|&amp;quot;nodos (N i d) = 1+(nodos i)+(nodos d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;size t= nodos t&amp;quot;&lt;br /&gt;
apply (induct t, auto)done&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
value &amp;quot;size (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;
  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;
&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;
text{*Pedrosrei: Los enunciados y demostraciones que vienen a continuación &lt;br /&gt;
son feos y engorrosos. Yo he optado por demostrarlo todo a través de &lt;br /&gt;
una propiedad extraña a la demostración en principio. Animo encarecidamente&lt;br /&gt;
a que pongáis una demostración más corta y directa. Voy explicando paso&lt;br /&gt;
a paso qué he hecho en cada momento. Hecha esta demostración, el resto&lt;br /&gt;
son triviales por una cadena de resultados. &lt;br /&gt;
 No existe relación de implicación en ningún sentido &lt;br /&gt;
 entre hojas y profundidad, como es obvio y muestran los siguientes&lt;br /&gt;
 contraejemplos: *}&lt;br /&gt;
lemma &amp;quot;(((hojas(t1) = hojas(t2)))--&amp;gt;(profundidad(t1) = profundidad(t2)))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) --&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) &amp;lt;-&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {* Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
t1 = N (N H H) (N H H)&lt;br /&gt;
t2 = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
hojas t1 = 4&lt;br /&gt;
hojas t2 = 3&lt;br /&gt;
&lt;br /&gt;
Ahora pongo una serie de resultados auxiliares que ayudarán en la prueba&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
lemma auxprof:&amp;quot;(es_abc profundidad t)∧(profundidad t = n)==&amp;gt; (t= abc n)&amp;quot;&lt;br /&gt;
apply (induct t arbitrary:n, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma eq_1_iff_exp_0:&amp;quot;Suc 0 = 2 ^ n &amp;lt;-&amp;gt; n=0&amp;quot;  apply (cases n, auto) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhojas:&amp;quot;(t= abc n)==&amp;gt; (es_abc hojas t)&amp;quot;&lt;br /&gt;
apply (induct n arbitrary: t, auto simp add: eq_1_iff_exp_0) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhoja:&amp;quot;(t= abc n)==&amp;gt;((hojas t = 2^n))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Y aquí viene la demostración larga y fea que os animo a mejorar.&lt;br /&gt;
He dejado los pasos exactamente que indica el razonador para que &lt;br /&gt;
veáis qué hace en cada caso:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_hoja:&amp;quot;es_abc profundidad t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc hojas t&amp;quot; using auxhojas by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc hojas t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
       hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
         es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
         hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc hojas t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
           hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc hojas t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;hojas t1 = hojas t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc hojas t1&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t1 = (2::nat)^n&amp;quot; using 2 auxhoja by auto&lt;br /&gt;
               hence 3:&amp;quot;hojas t2 =  (2::nat)^n&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc hojas t2&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t2 =  (2::nat)^m&amp;quot; using 5 auxhoja by auto&lt;br /&gt;
               with 3 have &amp;quot; (2::nat)^m =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; apply (induct, auto)done&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: creo que tengo una demostración mas elegante tan&lt;br /&gt;
sólo hace falta encontrar la relacion entre hojas y profundidad*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma a1: &lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = 2^(pr1 a)&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma cpr1_chojas: &amp;quot;es_abc pr1 a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: esta la detallada*)&lt;br /&gt;
--&amp;quot;jeshorcob,caarvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc hojas 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc pr1 (N i d) = &lt;br /&gt;
    (pr1 i = pr1 d ∧ es_abc pr1 i ∧ es_abc pr1 d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (pr1 i = pr1 d ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d &lt;br /&gt;
      ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot; using a1 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc hojas (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;domcadgom&amp;quot;&lt;br /&gt;
lemma aux1: &amp;quot;(es_abc profundidad a) ⟹ (hojas a) =  (2^(profundidad  a))&amp;quot;&lt;br /&gt;
by (induct a,simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo1: &amp;quot;(es_abc (profundidad) a) = (es_abc (hojas) a)&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
  fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc profundidad a1 = es_abc hojas a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc profundidad a2 = es_abc hojas a2&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc profundidad a2 ∧ es_abc profundidad a1 ⟶ es_abc profundidad &lt;br /&gt;
(N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; using a1 a2 by (simp add: aux1)&lt;br /&gt;
  thus &amp;quot;es_abc profundidad (N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed&lt;br /&gt;
&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;
(* Javrodviv1: Bueno yo para este ejercicio he encontrado algo mas sencillo,&lt;br /&gt;
    tan solo hay que encontrar una relación de igualdad entre hojas y size,&lt;br /&gt;
    que para este caso es sencillo.*)&lt;br /&gt;
-- &amp;quot;Javrodviv1,carvelcab&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma hojasize_igualdad: &lt;br /&gt;
      &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
by (induct x, simp_all)&lt;br /&gt;
&lt;br /&gt;
(*lemma &amp;quot;es_abc size a &amp;lt;-&amp;gt; es_abc hojas a&amp;quot; Son equivalentes = es lo mismo que &amp;lt;-&amp;gt; &lt;br /&gt;
    matemáticamente hablando*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot; es_abc size a = es_abc hojas a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
by (induct a, simp_all add: hojasize_igualdad)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Aquí dejo esta. Es trivial debido a la demostración anterior,&lt;br /&gt;
sólo hace falta coger el mismo desvío. Aquí sí que podéis encontrar&lt;br /&gt;
una mucho más directa: *}&lt;br /&gt;
&lt;br /&gt;
lemma auxnodo:&amp;quot;(t= abc n)==&amp;gt;(es_abc nodos t)∧(nodos t = (2^n - 1))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma nodos_eq_hoja:&amp;quot;es_abc nodos t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof -&lt;br /&gt;
have 1:&amp;quot;es_abc hojas t &amp;lt;-&amp;gt; es_abc profundidad t&amp;quot; using prof_eq_hoja by auto&lt;br /&gt;
hence 2:&amp;quot;?P t = (es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot; by auto&lt;br /&gt;
have &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
with 1 2 show ?thesis by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: aquí similar*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma a2: &lt;br /&gt;
  assumes &amp;quot;es_abc size a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma chojas_cnodos: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a2)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc hojas a = es_abc size 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc hojas (N i d) = &lt;br /&gt;
    (hojas i = hojas d ∧ es_abc hojas i ∧ es_abc hojas d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d ∧ es_abc size i ∧ es_abc size d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (size i = size d &lt;br /&gt;
      ∧ es_abc size i ∧ es_abc size d)&amp;quot; using a2 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc size (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma aux2: &amp;quot;(es_abc size a) ⟹ ((hojas a) = ((size a) +1))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo2: &amp;quot;es_abc hojas a = es_abc (size) a&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
 fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc hojas a1 = es_abc size a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc hojas a2 = es_abc size a2&amp;quot;&lt;br /&gt;
  hence &amp;quot;es_abc size a2 ∧ es_abc size a1 ⟶ &lt;br /&gt;
es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; using a1 by (simp add: aux2)&lt;br /&gt;
  thus &amp;quot;es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* numero de hojas es size + 1 *)&lt;br /&gt;
lemma l_hojas_size: &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
show &amp;quot; hojas H = size H + 1&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
fix x1 x2&lt;br /&gt;
assume h1:&amp;quot;hojas x1 = size x1 + 1&amp;quot;&lt;br /&gt;
assume h2:&amp;quot;hojas x2 = size x2 + 1&amp;quot;&lt;br /&gt;
have &amp;quot;hojas (N x1 x2) =  hojas x1 + hojas x2&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size x1 + 1 + size x2 + 1&amp;quot; using h1 h2 by simp&lt;br /&gt;
also have &amp;quot;... =  (1 + size x1 + size x2) + 1&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size (N x1 x2) + 1&amp;quot; by simp&lt;br /&gt;
finally show  &amp;quot;hojas (N x1 x2) = size (N x1 x2) + 1&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* usando lema anterior *)&lt;br /&gt;
lemma rel_size_igualdad: &amp;quot; es_abc size  a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: l_hojas_size)&lt;br /&gt;
&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;
text {* Pedrosrei. De hecho, esta es una parte de la anterior: *}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_nodos: &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: sale directo como corolario de los anteriores*)&lt;br /&gt;
--&amp;quot;jeshorcob,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc size a&amp;quot;&lt;br /&gt;
using cpr1_chojas and chojas_cnodos by simp_all&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary completo3: &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
 using completo1 completo2 by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*&lt;br /&gt;
1.- En apartado 7 se demuestra que:&lt;br /&gt;
  es_abc profundidad a ⟷ es_abc hojas a&lt;br /&gt;
2.- En apartado 8 se demuestra que:&lt;br /&gt;
                           es_abc hojas a ⟷ es_abc size  a &lt;br /&gt;
3.- Luego podremos demostrar usando las anteriores:&lt;br /&gt;
    es_abc profundidad a ⟷ es_abc size  a &lt;br /&gt;
&lt;br /&gt;
Nota: Para apartado 7 uso demostración de &amp;quot;jeshorcob y carvelcab&amp;quot;, que&lt;br /&gt;
no he conseguido reproducir *) &lt;br /&gt;
lemma &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
using profundidad_y_hojas_completo rel_size_igualdad by simp_all&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot; es_abc f (abc n)&amp;quot;&lt;br /&gt;
apply (induct n, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom,carvelcab,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &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 n assume h: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (f (abc n) = f (abc n) ∧ &lt;br /&gt;
    es_abc f (abc n) ∧ es_abc f (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using h by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* Más detallada *)&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot; es_abc f (abc 0)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n &lt;br /&gt;
  assume h1: &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (es_abc f (abc n) ∧ es_abc f (abc n) ∧ &lt;br /&gt;
          ( f (abc n) = f (abc n)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ( f (abc n) = f (abc n) )&amp;quot; using h1 by simp&lt;br /&gt;
  also have &amp;quot;... = True &amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;es_abc f (abc n) ⟹ es_abc f (abc (Suc n))&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 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ==&amp;gt; (a= abc (profundidad a))&amp;quot;&lt;br /&gt;
apply (induct a, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a ⟹ (a = abc (pr1 a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟹ (a = abc (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a  ⟹ a = abc (profundidad a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc nodos&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {*&lt;br /&gt;
El contraejemplo no es más que una medida constante, la trivial:&lt;br /&gt;
&lt;br /&gt;
Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇣1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc R8_Arboles_binarios_completos.size x = False&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: usando size en lugar de nodos, se encuentra el&lt;br /&gt;
mismo contraejemplo*)&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc size&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(*&lt;br /&gt;
el contraejemplo es:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇩1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc size x = False&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f t = es_abc size t&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun medida :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;medida H = 0&amp;quot;&lt;br /&gt;
|  &amp;quot;medida (N i d) = 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;es_abc medida a = es_abc size a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
&lt;br /&gt;
(*Contraejemplo&lt;br /&gt;
value &amp;quot;es_abc medida (N H (N H H))&amp;quot; (*devuelve true*)&lt;br /&gt;
value &amp;quot;es_abc size (N H (N H H))&amp;quot;   (*devuelve false*)&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=232</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=232"/>
		<updated>2014-12-18T08:15:14Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R8: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Arboles_binarios_completos&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 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)&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;
&lt;br /&gt;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom, carvelcab, juacorvic&amp;quot;&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 i d) = hojas i + hojas d&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun max :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;max a b= (if a≥ b then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;max 6 3&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, carvelcab, juacorvic&amp;quot;&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 a b) = 1 + max (profundidad a) (profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Explico estas dos funciones, la que utilizo para los &lt;br /&gt;
  lemas de abajo es profundidad ya que profundidad1 me encuentra&lt;br /&gt;
  contraejemplos y para evitar eso busque definir profundidad&lt;br /&gt;
  definidad de manera distinta. No obstante la que a mi me parece&lt;br /&gt;
  mas sensata para definir la profundidad de un árbol es la &lt;br /&gt;
  profundidad1 *)&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Fallo mio ya lo corregí*)&lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: La profundidad correcta es la mayor. Si te encuentra&lt;br /&gt;
 contraejemplos más adelante es que te has equivocado en los&lt;br /&gt;
 enunciados. Las funciones máximo y mínimo vienen predefinidas&lt;br /&gt;
 ya sin necesidad de definirlas. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
fun pr1 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;pr1 H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;pr1 (N i d) = Suc(max (pr1 i) (pr1 d))&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom,carvelcab, juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot; (*¿Pudiera ser que esta sea más rápida?*)&lt;br /&gt;
fun abc1 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc1 0 = H&amp;quot;&lt;br /&gt;
 |&amp;quot;abc1 (Suc n) = (let a = abc1 n in N a a)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&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 a b) = ((f a = f b) ∧ (es_abc f a ∧ es_abc f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom, carvelcab&amp;quot;&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;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun es_abc3 :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc3 f H = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc3 f (N i d) = ( es_abc3 f i ∧ es_abc3 f d ∧ f i = f d )&amp;quot;&lt;br /&gt;
&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;
text{*Para entenderme he cambiado de función de tamaño, la demostración&lt;br /&gt;
es análoga pero buscando las simplificaciones de size cuando correspondan&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun nodos::&amp;quot;arbol ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;nodos H = 0&amp;quot;&lt;br /&gt;
|&amp;quot;nodos (N i d) = 1+(nodos i)+(nodos d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;size t= nodos t&amp;quot;&lt;br /&gt;
apply (induct t, auto)done&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
value &amp;quot;size (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;
  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;
&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;
text{*Pedrosrei: Los enunciados y demostraciones que vienen a continuación &lt;br /&gt;
son feos y engorrosos. Yo he optado por demostrarlo todo a través de &lt;br /&gt;
una propiedad extraña a la demostración en principio. Animo encarecidamente&lt;br /&gt;
a que pongáis una demostración más corta y directa. Voy explicando paso&lt;br /&gt;
a paso qué he hecho en cada momento. Hecha esta demostración, el resto&lt;br /&gt;
son triviales por una cadena de resultados. &lt;br /&gt;
 No existe relación de implicación en ningún sentido &lt;br /&gt;
 entre hojas y profundidad, como es obvio y muestran los siguientes&lt;br /&gt;
 contraejemplos: *}&lt;br /&gt;
lemma &amp;quot;(((hojas(t1) = hojas(t2)))--&amp;gt;(profundidad(t1) = profundidad(t2)))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) --&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) &amp;lt;-&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {* Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
t1 = N (N H H) (N H H)&lt;br /&gt;
t2 = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
hojas t1 = 4&lt;br /&gt;
hojas t2 = 3&lt;br /&gt;
&lt;br /&gt;
Ahora pongo una serie de resultados auxiliares que ayudarán en la prueba&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
lemma auxprof:&amp;quot;(es_abc profundidad t)∧(profundidad t = n)==&amp;gt; (t= abc n)&amp;quot;&lt;br /&gt;
apply (induct t arbitrary:n, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma eq_1_iff_exp_0:&amp;quot;Suc 0 = 2 ^ n &amp;lt;-&amp;gt; n=0&amp;quot;  apply (cases n, auto) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhojas:&amp;quot;(t= abc n)==&amp;gt; (es_abc hojas t)&amp;quot;&lt;br /&gt;
apply (induct n arbitrary: t, auto simp add: eq_1_iff_exp_0) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhoja:&amp;quot;(t= abc n)==&amp;gt;((hojas t = 2^n))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Y aquí viene la demostración larga y fea que os animo a mejorar.&lt;br /&gt;
He dejado los pasos exactamente que indica el razonador para que &lt;br /&gt;
veáis qué hace en cada caso:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_hoja:&amp;quot;es_abc profundidad t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc hojas t&amp;quot; using auxhojas by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc hojas t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
       hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
         es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
         hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc hojas t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
           hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc hojas t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;hojas t1 = hojas t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc hojas t1&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t1 = (2::nat)^n&amp;quot; using 2 auxhoja by auto&lt;br /&gt;
               hence 3:&amp;quot;hojas t2 =  (2::nat)^n&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc hojas t2&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t2 =  (2::nat)^m&amp;quot; using 5 auxhoja by auto&lt;br /&gt;
               with 3 have &amp;quot; (2::nat)^m =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; apply (induct, auto)done&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: creo que tengo una demostración mas elegante tan&lt;br /&gt;
sólo hace falta encontrar la relacion entre hojas y profundidad*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma a1: &lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = 2^(pr1 a)&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma cpr1_chojas: &amp;quot;es_abc pr1 a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: esta la detallada*)&lt;br /&gt;
--&amp;quot;jeshorcob,caarvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc hojas 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc pr1 (N i d) = &lt;br /&gt;
    (pr1 i = pr1 d ∧ es_abc pr1 i ∧ es_abc pr1 d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (pr1 i = pr1 d ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d &lt;br /&gt;
      ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot; using a1 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc hojas (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;domcadgom&amp;quot;&lt;br /&gt;
lemma aux1: &amp;quot;(es_abc profundidad a) ⟹ (hojas a) =  (2^(profundidad  a))&amp;quot;&lt;br /&gt;
by (induct a,simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo1: &amp;quot;(es_abc (profundidad) a) = (es_abc (hojas) a)&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
  fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc profundidad a1 = es_abc hojas a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc profundidad a2 = es_abc hojas a2&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc profundidad a2 ∧ es_abc profundidad a1 ⟶ es_abc profundidad &lt;br /&gt;
(N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; using a1 a2 by (simp add: aux1)&lt;br /&gt;
  thus &amp;quot;es_abc profundidad (N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed&lt;br /&gt;
&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;
(* Javrodviv1: Bueno yo para este ejercicio he encontrado algo mas sencillo,&lt;br /&gt;
    tan solo hay que encontrar una relación de igualdad entre hojas y size,&lt;br /&gt;
    que para este caso es sencillo.*)&lt;br /&gt;
-- &amp;quot;Javrodviv1,carvelcab&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma hojasize_igualdad: &lt;br /&gt;
      &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
by (induct x, simp_all)&lt;br /&gt;
&lt;br /&gt;
(*lemma &amp;quot;es_abc size a &amp;lt;-&amp;gt; es_abc hojas a&amp;quot; Son equivalentes = es lo mismo que &amp;lt;-&amp;gt; &lt;br /&gt;
    matemáticamente hablando*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot; es_abc size a = es_abc hojas a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
by (induct a, simp_all add: hojasize_igualdad)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Aquí dejo esta. Es trivial debido a la demostración anterior,&lt;br /&gt;
sólo hace falta coger el mismo desvío. Aquí sí que podéis encontrar&lt;br /&gt;
una mucho más directa: *}&lt;br /&gt;
&lt;br /&gt;
lemma auxnodo:&amp;quot;(t= abc n)==&amp;gt;(es_abc nodos t)∧(nodos t = (2^n - 1))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma nodos_eq_hoja:&amp;quot;es_abc nodos t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof -&lt;br /&gt;
have 1:&amp;quot;es_abc hojas t &amp;lt;-&amp;gt; es_abc profundidad t&amp;quot; using prof_eq_hoja by auto&lt;br /&gt;
hence 2:&amp;quot;?P t = (es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot; by auto&lt;br /&gt;
have &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
with 1 2 show ?thesis by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: aquí similar*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma a2: &lt;br /&gt;
  assumes &amp;quot;es_abc size a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma chojas_cnodos: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a2)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc hojas a = es_abc size 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc hojas (N i d) = &lt;br /&gt;
    (hojas i = hojas d ∧ es_abc hojas i ∧ es_abc hojas d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d ∧ es_abc size i ∧ es_abc size d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (size i = size d &lt;br /&gt;
      ∧ es_abc size i ∧ es_abc size d)&amp;quot; using a2 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc size (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma aux2: &amp;quot;(es_abc size a) ⟹ ((hojas a) = ((size a) +1))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo2: &amp;quot;es_abc hojas a = es_abc (size) a&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
 fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc hojas a1 = es_abc size a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc hojas a2 = es_abc size a2&amp;quot;&lt;br /&gt;
  hence &amp;quot;es_abc size a2 ∧ es_abc size a1 ⟶ &lt;br /&gt;
es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; using a1 by (simp add: aux2)&lt;br /&gt;
  thus &amp;quot;es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* numero de hojas es size + 1 *)&lt;br /&gt;
lemma l_hojas_size: &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
show &amp;quot; hojas H = size H + 1&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
fix x1 x2&lt;br /&gt;
assume h1:&amp;quot;hojas x1 = size x1 + 1&amp;quot;&lt;br /&gt;
assume h2:&amp;quot;hojas x2 = size x2 + 1&amp;quot;&lt;br /&gt;
have &amp;quot;hojas (N x1 x2) =  hojas x1 + hojas x2&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size x1 + 1 + size x2 + 1&amp;quot; using h1 h2 by simp&lt;br /&gt;
also have &amp;quot;... =  (1 + size x1 + size x2) + 1&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size (N x1 x2) + 1&amp;quot; by simp&lt;br /&gt;
finally show  &amp;quot;hojas (N x1 x2) = size (N x1 x2) + 1&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* usando lema anterior *)&lt;br /&gt;
lemma rel_size_igualdad: &amp;quot; es_abc size  a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: l_hojas_size)&lt;br /&gt;
&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;
text {* Pedrosrei. De hecho, esta es una parte de la anterior: *}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_nodos: &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: sale directo como corolario de los anteriores*)&lt;br /&gt;
--&amp;quot;jeshorcob,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc size a&amp;quot;&lt;br /&gt;
using cpr1_chojas and chojas_cnodos by simp_all&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary completo3: &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
 using completo1 completo2 by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*&lt;br /&gt;
1.- En apartado 7 se demuestra que:&lt;br /&gt;
  es_abc profundidad a ⟷ es_abc hojas a&lt;br /&gt;
2.- En apartado 8 se demuestra que:&lt;br /&gt;
                           es_abc hojas a ⟷ es_abc size  a &lt;br /&gt;
3.- Luego podremos demostrar usando las anteriores:&lt;br /&gt;
    es_abc profundidad a ⟷ es_abc size  a &lt;br /&gt;
&lt;br /&gt;
Nota: Para apartado 7 uso demostración de &amp;quot;jeshorcob y carvelcab&amp;quot;, que&lt;br /&gt;
no he conseguido reproducir *) &lt;br /&gt;
lemma &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
using profundidad_y_hojas_completo rel_size_igualdad by simp_all&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot; es_abc f (abc n)&amp;quot;&lt;br /&gt;
apply (induct n, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom,carvelcab,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &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 n assume h: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (f (abc n) = f (abc n) ∧ &lt;br /&gt;
    es_abc f (abc n) ∧ es_abc f (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using h by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* Más detallada *)&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot; es_abc f (abc 0)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n &lt;br /&gt;
  assume h1: &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (es_abc f (abc n) ∧ es_abc f (abc n) ∧ &lt;br /&gt;
          ( f (abc n) = f (abc n)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ( f (abc n) = f (abc n) )&amp;quot; using h1 by simp&lt;br /&gt;
  also have &amp;quot;... = True &amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;es_abc f (abc n) ⟹ es_abc f (abc (Suc n))&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 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ==&amp;gt; (a= abc (profundidad a))&amp;quot;&lt;br /&gt;
apply (induct a, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a ⟹ (a = abc (pr1 a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟹ (a = abc (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a  ⟹ a = abc (profundidad a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc nodos&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {*&lt;br /&gt;
El contraejemplo no es más que una medida constante, la trivial:&lt;br /&gt;
&lt;br /&gt;
Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇣1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc R8_Arboles_binarios_completos.size x = False&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: usando size en lugar de nodos, se encuentra el&lt;br /&gt;
mismo contraejemplo*)&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc size&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(*&lt;br /&gt;
el contraejemplo es:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇩1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc size x = False&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f t = es_abc size t&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun medida :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;medida H = 0&amp;quot;&lt;br /&gt;
|  &amp;quot;medida (N i d) = 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;es_abc medida a = es_abc size a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
&lt;br /&gt;
(*Contraejemplo&lt;br /&gt;
value &amp;quot;es_abc medida (N H (N H H))&amp;quot; (*devuelve true*)&lt;br /&gt;
value &amp;quot;es_abc size (N H (N H H))&amp;quot;   (*devuelve false*)&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=231</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=231"/>
		<updated>2014-12-18T08:01:52Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R8: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Arboles_binarios_completos&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 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)&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;
&lt;br /&gt;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom, carvelcab, juacorvic&amp;quot;&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 i d) = hojas i + hojas d&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun max :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;max a b= (if a≥ b then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;max 6 3&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, carvelcab, juacorvic&amp;quot;&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 a b) = 1 + max (profundidad a) (profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Explico estas dos funciones, la que utilizo para los &lt;br /&gt;
  lemas de abajo es profundidad ya que profundidad1 me encuentra&lt;br /&gt;
  contraejemplos y para evitar eso busque definir profundidad&lt;br /&gt;
  definidad de manera distinta. No obstante la que a mi me parece&lt;br /&gt;
  mas sensata para definir la profundidad de un árbol es la &lt;br /&gt;
  profundidad1 *)&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Fallo mio ya lo corregí*)&lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: La profundidad correcta es la mayor. Si te encuentra&lt;br /&gt;
 contraejemplos más adelante es que te has equivocado en los&lt;br /&gt;
 enunciados. Las funciones máximo y mínimo vienen predefinidas&lt;br /&gt;
 ya sin necesidad de definirlas. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
fun pr1 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;pr1 H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;pr1 (N i d) = Suc(max (pr1 i) (pr1 d))&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom,carvelcab, juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot; (*¿Pudiera ser que esta sea más rápida?*)&lt;br /&gt;
fun abc1 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc1 0 = H&amp;quot;&lt;br /&gt;
 |&amp;quot;abc1 (Suc n) = (let a = abc1 n in N a a)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&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 a b) = ((f a = f b) ∧ (es_abc f a ∧ es_abc f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom, carvelcab&amp;quot;&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;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun es_abc3 :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc3 f H = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc3 f (N i d) = ( es_abc3 f i ∧ es_abc3 f d ∧ f i = f d )&amp;quot;&lt;br /&gt;
&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;
text{*Para entenderme he cambiado de función de tamaño, la demostración&lt;br /&gt;
es análoga pero buscando las simplificaciones de size cuando correspondan&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun nodos::&amp;quot;arbol ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;nodos H = 0&amp;quot;&lt;br /&gt;
|&amp;quot;nodos (N i d) = 1+(nodos i)+(nodos d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;size t= nodos t&amp;quot;&lt;br /&gt;
apply (induct t, auto)done&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
value &amp;quot;size (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;
  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;
&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;
text{*Pedrosrei: Los enunciados y demostraciones que vienen a continuación &lt;br /&gt;
son feos y engorrosos. Yo he optado por demostrarlo todo a través de &lt;br /&gt;
una propiedad extraña a la demostración en principio. Animo encarecidamente&lt;br /&gt;
a que pongáis una demostración más corta y directa. Voy explicando paso&lt;br /&gt;
a paso qué he hecho en cada momento. Hecha esta demostración, el resto&lt;br /&gt;
son triviales por una cadena de resultados. &lt;br /&gt;
 No existe relación de implicación en ningún sentido &lt;br /&gt;
 entre hojas y profundidad, como es obvio y muestran los siguientes&lt;br /&gt;
 contraejemplos: *}&lt;br /&gt;
lemma &amp;quot;(((hojas(t1) = hojas(t2)))--&amp;gt;(profundidad(t1) = profundidad(t2)))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) --&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) &amp;lt;-&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {* Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
t1 = N (N H H) (N H H)&lt;br /&gt;
t2 = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
hojas t1 = 4&lt;br /&gt;
hojas t2 = 3&lt;br /&gt;
&lt;br /&gt;
Ahora pongo una serie de resultados auxiliares que ayudarán en la prueba&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
lemma auxprof:&amp;quot;(es_abc profundidad t)∧(profundidad t = n)==&amp;gt; (t= abc n)&amp;quot;&lt;br /&gt;
apply (induct t arbitrary:n, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma eq_1_iff_exp_0:&amp;quot;Suc 0 = 2 ^ n &amp;lt;-&amp;gt; n=0&amp;quot;  apply (cases n, auto) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhojas:&amp;quot;(t= abc n)==&amp;gt; (es_abc hojas t)&amp;quot;&lt;br /&gt;
apply (induct n arbitrary: t, auto simp add: eq_1_iff_exp_0) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhoja:&amp;quot;(t= abc n)==&amp;gt;((hojas t = 2^n))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Y aquí viene la demostración larga y fea que os animo a mejorar.&lt;br /&gt;
He dejado los pasos exactamente que indica el razonador para que &lt;br /&gt;
veáis qué hace en cada caso:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_hoja:&amp;quot;es_abc profundidad t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc hojas t&amp;quot; using auxhojas by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc hojas t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
       hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
         es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
         hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc hojas t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
           hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc hojas t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;hojas t1 = hojas t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc hojas t1&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t1 = (2::nat)^n&amp;quot; using 2 auxhoja by auto&lt;br /&gt;
               hence 3:&amp;quot;hojas t2 =  (2::nat)^n&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc hojas t2&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t2 =  (2::nat)^m&amp;quot; using 5 auxhoja by auto&lt;br /&gt;
               with 3 have &amp;quot; (2::nat)^m =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; apply (induct, auto)done&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: creo que tengo una demostración mas elegante tan&lt;br /&gt;
sólo hace falta encontrar la relacion entre hojas y profundidad*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma a1: &lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = 2^(pr1 a)&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma cpr1_chojas: &amp;quot;es_abc pr1 a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: esta la detallada*)&lt;br /&gt;
--&amp;quot;jeshorcob,caarvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc hojas 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc pr1 (N i d) = &lt;br /&gt;
    (pr1 i = pr1 d ∧ es_abc pr1 i ∧ es_abc pr1 d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (pr1 i = pr1 d ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d &lt;br /&gt;
      ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot; using a1 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc hojas (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;domcadgom&amp;quot;&lt;br /&gt;
lemma aux1: &amp;quot;(es_abc profundidad a) ⟹ (hojas a) =  (2^(profundidad  a))&amp;quot;&lt;br /&gt;
by (induct a,simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo1: &amp;quot;(es_abc (profundidad) a) = (es_abc (hojas) a)&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
  fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc profundidad a1 = es_abc hojas a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc profundidad a2 = es_abc hojas a2&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc profundidad a2 ∧ es_abc profundidad a1 ⟶ es_abc profundidad &lt;br /&gt;
(N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; using a1 a2 by (simp add: aux1)&lt;br /&gt;
  thus &amp;quot;es_abc profundidad (N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed&lt;br /&gt;
&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;
(* Javrodviv1: Bueno yo para este ejercicio he encontrado algo mas sencillo,&lt;br /&gt;
    tan solo hay que encontrar una relación de igualdad entre hojas y size,&lt;br /&gt;
    que para este caso es sencillo.*)&lt;br /&gt;
-- &amp;quot;Javrodviv1,carvelcab&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma hojasize_igualdad: &lt;br /&gt;
      &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
by (induct x, simp_all)&lt;br /&gt;
&lt;br /&gt;
(*lemma &amp;quot;es_abc size a &amp;lt;-&amp;gt; es_abc hojas a&amp;quot; Son equivalentes = es lo mismo que &amp;lt;-&amp;gt; &lt;br /&gt;
    matemáticamente hablando*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot; es_abc size a = es_abc hojas a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
by (induct a, simp_all add: hojasize_igualdad)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Aquí dejo esta. Es trivial debido a la demostración anterior,&lt;br /&gt;
sólo hace falta coger el mismo desvío. Aquí sí que podéis encontrar&lt;br /&gt;
una mucho más directa: *}&lt;br /&gt;
&lt;br /&gt;
lemma auxnodo:&amp;quot;(t= abc n)==&amp;gt;(es_abc nodos t)∧(nodos t = (2^n - 1))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma nodos_eq_hoja:&amp;quot;es_abc nodos t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof -&lt;br /&gt;
have 1:&amp;quot;es_abc hojas t &amp;lt;-&amp;gt; es_abc profundidad t&amp;quot; using prof_eq_hoja by auto&lt;br /&gt;
hence 2:&amp;quot;?P t = (es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot; by auto&lt;br /&gt;
have &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
with 1 2 show ?thesis by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: aquí similar*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma a2: &lt;br /&gt;
  assumes &amp;quot;es_abc size a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma chojas_cnodos: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a2)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc hojas a = es_abc size 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc hojas (N i d) = &lt;br /&gt;
    (hojas i = hojas d ∧ es_abc hojas i ∧ es_abc hojas d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d ∧ es_abc size i ∧ es_abc size d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (size i = size d &lt;br /&gt;
      ∧ es_abc size i ∧ es_abc size d)&amp;quot; using a2 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc size (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma aux2: &amp;quot;(es_abc size a) ⟹ ((hojas a) = ((size a) +1))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo2: &amp;quot;es_abc hojas a = es_abc (size) a&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
 fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc hojas a1 = es_abc size a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc hojas a2 = es_abc size a2&amp;quot;&lt;br /&gt;
  hence &amp;quot;es_abc size a2 ∧ es_abc size a1 ⟶ &lt;br /&gt;
es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; using a1 by (simp add: aux2)&lt;br /&gt;
  thus &amp;quot;es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* numero de hojas es size + 1 *)&lt;br /&gt;
lemma l_hojas_size: &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
show &amp;quot; hojas H = size H + 1&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
fix x1 x2&lt;br /&gt;
assume h1:&amp;quot;hojas x1 = size x1 + 1&amp;quot;&lt;br /&gt;
assume h2:&amp;quot;hojas x2 = size x2 + 1&amp;quot;&lt;br /&gt;
have &amp;quot;hojas (N x1 x2) =  hojas x1 + hojas x2&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size x1 + 1 + size x2 + 1&amp;quot; using h1 h2 by simp&lt;br /&gt;
also have &amp;quot;... =  (1 + size x1 + size x2) + 1&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size (N x1 x2) + 1&amp;quot; by simp&lt;br /&gt;
finally show  &amp;quot;hojas (N x1 x2) = size (N x1 x2) + 1&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* usando lema anterior *)&lt;br /&gt;
lemma rel_size_igualdad: &amp;quot; es_abc size  a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: l_hojas_size)&lt;br /&gt;
&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;
text {* Pedrosrei. De hecho, esta es una parte de la anterior: *}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_nodos: &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: sale directo como corolario de los anteriores*)&lt;br /&gt;
--&amp;quot;jeshorcob,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc size a&amp;quot;&lt;br /&gt;
using cpr1_chojas and chojas_cnodos by simp_all&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary completo3: &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
 using completo1 completo2 by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*&lt;br /&gt;
1.- En apartado 7 se demuestra que:&lt;br /&gt;
  es_abc profundidad a ⟷ es_abc hojas a&lt;br /&gt;
2.- En apartado 8 se demuestra que:&lt;br /&gt;
                           es_abc hojas a ⟷ es_abc size  a &lt;br /&gt;
3.- Luego podremos demostrar usando las anteriores:&lt;br /&gt;
    es_abc profundidad a ⟷ es_abc size  a &lt;br /&gt;
&lt;br /&gt;
Nota: Para apartado 7 uso demostración de &amp;quot;jeshorcob y carvelcab&amp;quot;, que&lt;br /&gt;
no he conseguido reproducir *) &lt;br /&gt;
lemma &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
using profundidad_y_hojas_completo rel_size_igualdad by simp_all&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot; es_abc f (abc n)&amp;quot;&lt;br /&gt;
apply (induct n, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom,carvelcab,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &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 n assume h: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (f (abc n) = f (abc n) ∧ &lt;br /&gt;
    es_abc f (abc n) ∧ es_abc f (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using h by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* Más detallada *)&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot; es_abc f (abc 0)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n &lt;br /&gt;
  assume h1: &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (es_abc f (abc n) ∧ es_abc f (abc n) ∧ &lt;br /&gt;
          ( f (abc n) = f (abc n)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ( f (abc n) = f (abc n) )&amp;quot; using h1 by simp&lt;br /&gt;
  also have &amp;quot;... = True &amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;es_abc f (abc n) ⟹ es_abc f (abc (Suc n))&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 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ==&amp;gt; (a= abc (profundidad a))&amp;quot;&lt;br /&gt;
apply (induct a, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a ⟹ (a = abc (pr1 a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟹ (a = abc (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a  ⟹ a = abc (profundidad a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc nodos&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {*&lt;br /&gt;
El contraejemplo no es más que una medida constante, la trivial:&lt;br /&gt;
&lt;br /&gt;
Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇣1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc R8_Arboles_binarios_completos.size x = False&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: usando size en lugar de nodos, se encuentra el&lt;br /&gt;
mismo contraejemplo*)&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc size&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(*&lt;br /&gt;
el contraejemplo es:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇩1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc size x = False&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f t = es_abc size t&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=230</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=230"/>
		<updated>2014-12-17T11:10:05Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R8: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Arboles_binarios_completos&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 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)&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;
&lt;br /&gt;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom, carvelcab, juacorvic&amp;quot;&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 i d) = hojas i + hojas d&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun max :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;max a b= (if a≥ b then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;max 6 3&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, carvelcab, juacorvic&amp;quot;&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 a b) = 1 + max (profundidad a) (profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Explico estas dos funciones, la que utilizo para los &lt;br /&gt;
  lemas de abajo es profundidad ya que profundidad1 me encuentra&lt;br /&gt;
  contraejemplos y para evitar eso busque definir profundidad&lt;br /&gt;
  definidad de manera distinta. No obstante la que a mi me parece&lt;br /&gt;
  mas sensata para definir la profundidad de un árbol es la &lt;br /&gt;
  profundidad1 *)&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Fallo mio ya lo corregí*)&lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: La profundidad correcta es la mayor. Si te encuentra&lt;br /&gt;
 contraejemplos más adelante es que te has equivocado en los&lt;br /&gt;
 enunciados. Las funciones máximo y mínimo vienen predefinidas&lt;br /&gt;
 ya sin necesidad de definirlas. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
fun pr1 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;pr1 H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;pr1 (N i d) = Suc(max (pr1 i) (pr1 d))&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom,carvelcab, juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot; (*¿Pudiera ser que esta sea más rápida?*)&lt;br /&gt;
fun abc1 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc1 0 = H&amp;quot;&lt;br /&gt;
 |&amp;quot;abc1 (Suc n) = (let a = abc1 n in N a a)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&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 a b) = ((f a = f b) ∧ (es_abc f a ∧ es_abc f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom, carvelcab&amp;quot;&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;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun es_abc3 :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc3 f H = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc3 f (N i d) = ( es_abc3 f i ∧ es_abc3 f d ∧ f i = f d )&amp;quot;&lt;br /&gt;
&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;
text{*Para entenderme he cambiado de función de tamaño, la demostración&lt;br /&gt;
es análoga pero buscando las simplificaciones de size cuando correspondan&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun nodos::&amp;quot;arbol ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;nodos H = 0&amp;quot;&lt;br /&gt;
|&amp;quot;nodos (N i d) = 1+(nodos i)+(nodos d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;size t= nodos t&amp;quot;&lt;br /&gt;
apply (induct t, auto)done&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
value &amp;quot;size (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;
  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;
&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;
text{*Pedrosrei: Los enunciados y demostraciones que vienen a continuación &lt;br /&gt;
son feos y engorrosos. Yo he optado por demostrarlo todo a través de &lt;br /&gt;
una propiedad extraña a la demostración en principio. Animo encarecidamente&lt;br /&gt;
a que pongáis una demostración más corta y directa. Voy explicando paso&lt;br /&gt;
a paso qué he hecho en cada momento. Hecha esta demostración, el resto&lt;br /&gt;
son triviales por una cadena de resultados. &lt;br /&gt;
 No existe relación de implicación en ningún sentido &lt;br /&gt;
 entre hojas y profundidad, como es obvio y muestran los siguientes&lt;br /&gt;
 contraejemplos: *}&lt;br /&gt;
lemma &amp;quot;(((hojas(t1) = hojas(t2)))--&amp;gt;(profundidad(t1) = profundidad(t2)))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) --&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) &amp;lt;-&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {* Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
t1 = N (N H H) (N H H)&lt;br /&gt;
t2 = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
hojas t1 = 4&lt;br /&gt;
hojas t2 = 3&lt;br /&gt;
&lt;br /&gt;
Ahora pongo una serie de resultados auxiliares que ayudarán en la prueba&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
lemma auxprof:&amp;quot;(es_abc profundidad t)∧(profundidad t = n)==&amp;gt; (t= abc n)&amp;quot;&lt;br /&gt;
apply (induct t arbitrary:n, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma eq_1_iff_exp_0:&amp;quot;Suc 0 = 2 ^ n &amp;lt;-&amp;gt; n=0&amp;quot;  apply (cases n, auto) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhojas:&amp;quot;(t= abc n)==&amp;gt; (es_abc hojas t)&amp;quot;&lt;br /&gt;
apply (induct n arbitrary: t, auto simp add: eq_1_iff_exp_0) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhoja:&amp;quot;(t= abc n)==&amp;gt;((hojas t = 2^n))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Y aquí viene la demostración larga y fea que os animo a mejorar.&lt;br /&gt;
He dejado los pasos exactamente que indica el razonador para que &lt;br /&gt;
veáis qué hace en cada caso:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_hoja:&amp;quot;es_abc profundidad t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc hojas t&amp;quot; using auxhojas by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc hojas t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
       hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
         es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
         hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc hojas t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
           hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc hojas t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;hojas t1 = hojas t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc hojas t1&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t1 = (2::nat)^n&amp;quot; using 2 auxhoja by auto&lt;br /&gt;
               hence 3:&amp;quot;hojas t2 =  (2::nat)^n&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc hojas t2&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t2 =  (2::nat)^m&amp;quot; using 5 auxhoja by auto&lt;br /&gt;
               with 3 have &amp;quot; (2::nat)^m =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; apply (induct, auto)done&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: creo que tengo una demostración mas elegante tan&lt;br /&gt;
sólo hace falta encontrar la relacion entre hojas y profundidad*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma a1: &lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = 2^(pr1 a)&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma cpr1_chojas: &amp;quot;es_abc pr1 a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: esta la detallada*)&lt;br /&gt;
--&amp;quot;jeshorcob,caarvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc hojas 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc pr1 (N i d) = &lt;br /&gt;
    (pr1 i = pr1 d ∧ es_abc pr1 i ∧ es_abc pr1 d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (pr1 i = pr1 d ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d &lt;br /&gt;
      ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot; using a1 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc hojas (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;domcadgom&amp;quot;&lt;br /&gt;
lemma aux1: &amp;quot;(es_abc profundidad a) ⟹ (hojas a) =  (2^(profundidad  a))&amp;quot;&lt;br /&gt;
by (induct a,simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo1: &amp;quot;(es_abc (profundidad) a) = (es_abc (hojas) a)&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
  fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc profundidad a1 = es_abc hojas a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc profundidad a2 = es_abc hojas a2&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc profundidad a2 ∧ es_abc profundidad a1 ⟶ es_abc profundidad &lt;br /&gt;
(N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; using a1 a2 by (simp add: aux1)&lt;br /&gt;
  thus &amp;quot;es_abc profundidad (N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed&lt;br /&gt;
&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;
(* Javrodviv1: Bueno yo para este ejercicio he encontrado algo mas sencillo,&lt;br /&gt;
    tan solo hay que encontrar una relación de igualdad entre hojas y size,&lt;br /&gt;
    que para este caso es sencillo.*)&lt;br /&gt;
-- &amp;quot;Javrodviv1,carvelcab&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma hojasize_igualdad: &lt;br /&gt;
      &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
by (induct x, simp_all)&lt;br /&gt;
&lt;br /&gt;
(*lemma &amp;quot;es_abc size a &amp;lt;-&amp;gt; es_abc hojas a&amp;quot; Son equivalentes = es lo mismo que &amp;lt;-&amp;gt; &lt;br /&gt;
    matemáticamente hablando*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot; es_abc size a = es_abc hojas a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
by (induct a, simp_all add: hojasize_igualdad)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Aquí dejo esta. Es trivial debido a la demostración anterior,&lt;br /&gt;
sólo hace falta coger el mismo desvío. Aquí sí que podéis encontrar&lt;br /&gt;
una mucho más directa: *}&lt;br /&gt;
&lt;br /&gt;
lemma auxnodo:&amp;quot;(t= abc n)==&amp;gt;(es_abc nodos t)∧(nodos t = (2^n - 1))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma nodos_eq_hoja:&amp;quot;es_abc nodos t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof -&lt;br /&gt;
have 1:&amp;quot;es_abc hojas t &amp;lt;-&amp;gt; es_abc profundidad t&amp;quot; using prof_eq_hoja by auto&lt;br /&gt;
hence 2:&amp;quot;?P t = (es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot; by auto&lt;br /&gt;
have &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
with 1 2 show ?thesis by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: aquí similar*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma a2: &lt;br /&gt;
  assumes &amp;quot;es_abc size a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma chojas_cnodos: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a2)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc hojas a = es_abc size 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc hojas (N i d) = &lt;br /&gt;
    (hojas i = hojas d ∧ es_abc hojas i ∧ es_abc hojas d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d ∧ es_abc size i ∧ es_abc size d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (size i = size d &lt;br /&gt;
      ∧ es_abc size i ∧ es_abc size d)&amp;quot; using a2 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc size (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma aux2: &amp;quot;(es_abc size a) ⟹ ((hojas a) = ((size a) +1))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo2: &amp;quot;es_abc hojas a = es_abc (size) a&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
 fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc hojas a1 = es_abc size a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc hojas a2 = es_abc size a2&amp;quot;&lt;br /&gt;
  hence &amp;quot;es_abc size a2 ∧ es_abc size a1 ⟶ &lt;br /&gt;
es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; using a1 by (simp add: aux2)&lt;br /&gt;
  thus &amp;quot;es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* numero de hojas es size + 1 *)&lt;br /&gt;
lemma l_hojas_size: &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
show &amp;quot; hojas H = size H + 1&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
fix x1 x2&lt;br /&gt;
assume h1:&amp;quot;hojas x1 = size x1 + 1&amp;quot;&lt;br /&gt;
assume h2:&amp;quot;hojas x2 = size x2 + 1&amp;quot;&lt;br /&gt;
have &amp;quot;hojas (N x1 x2) =  hojas x1 + hojas x2&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size x1 + 1 + size x2 + 1&amp;quot; using h1 h2 by simp&lt;br /&gt;
also have &amp;quot;... =  (1 + size x1 + size x2) + 1&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size (N x1 x2) + 1&amp;quot; by simp&lt;br /&gt;
finally show  &amp;quot;hojas (N x1 x2) = size (N x1 x2) + 1&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* usando lema anterior *)&lt;br /&gt;
lemma rel_size_igualdad: &amp;quot; es_abc size  a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: l_hojas_size)&lt;br /&gt;
&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;
text {* Pedrosrei. De hecho, esta es una parte de la anterior: *}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_nodos: &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: sale directo como corolario de los anteriores*)&lt;br /&gt;
--&amp;quot;jeshorcob,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc size a&amp;quot;&lt;br /&gt;
using cpr1_chojas and chojas_cnodos by simp_all&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary completo3: &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
 using completo1 completo2 by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*&lt;br /&gt;
1.- En apartado 7 se demuestra que:&lt;br /&gt;
  es_abc profundidad a ⟷ es_abc hojas a&lt;br /&gt;
2.- En apartado 8 se demuestra que:&lt;br /&gt;
                           es_abc hojas a ⟷ es_abc size  a &lt;br /&gt;
3.- Luego podremos demostrar usando las anteriores:&lt;br /&gt;
    es_abc profundidad a ⟷ es_abc size  a &lt;br /&gt;
&lt;br /&gt;
Nota: Para apartado 7 uso demostración de &amp;quot;jeshorcob y carvelcab&amp;quot;, que&lt;br /&gt;
no he conseguido reproducir *) &lt;br /&gt;
lemma &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
using profundidad_y_hojas_completo rel_size_igualdad by simp_all&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot; es_abc f (abc n)&amp;quot;&lt;br /&gt;
apply (induct n, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom,carvelcab,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &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 n assume h: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (f (abc n) = f (abc n) ∧ &lt;br /&gt;
    es_abc f (abc n) ∧ es_abc f (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using h by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* Más detallada *)&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot; es_abc f (abc 0)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n &lt;br /&gt;
  assume h1: &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (es_abc f (abc n) ∧ es_abc f (abc n) ∧ &lt;br /&gt;
          ( f (abc n) = f (abc n)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ( f (abc n) = f (abc n) )&amp;quot; using h1 by simp&lt;br /&gt;
  also have &amp;quot;... = True &amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;es_abc f (abc n) ⟹ es_abc f (abc (Suc n))&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 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ==&amp;gt; (a= abc (profundidad a))&amp;quot;&lt;br /&gt;
apply (induct a, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a ⟹ (a = abc (pr1 a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟹ (a = abc (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc nodos&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {*&lt;br /&gt;
El contraejemplo no es más que una medida constante, la trivial:&lt;br /&gt;
&lt;br /&gt;
Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇣1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc R8_Arboles_binarios_completos.size x = False&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: usando size en lugar de nodos, se encuentra el&lt;br /&gt;
mismo contraejemplo*)&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc size&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(*&lt;br /&gt;
el contraejemplo es:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇩1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc size x = False&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f t = es_abc size t&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=229</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=229"/>
		<updated>2014-12-17T08:42:49Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R8: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Arboles_binarios_completos&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 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)&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;
&lt;br /&gt;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom, carvelcab, juacorvic&amp;quot;&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 i d) = hojas i + hojas d&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun max :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;max a b= (if a≥ b then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;max 6 3&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, carvelcab, juacorvic&amp;quot;&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 a b) = 1 + max (profundidad a) (profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Explico estas dos funciones, la que utilizo para los &lt;br /&gt;
  lemas de abajo es profundidad ya que profundidad1 me encuentra&lt;br /&gt;
  contraejemplos y para evitar eso busque definir profundidad&lt;br /&gt;
  definidad de manera distinta. No obstante la que a mi me parece&lt;br /&gt;
  mas sensata para definir la profundidad de un árbol es la &lt;br /&gt;
  profundidad1 *)&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Fallo mio ya lo corregí*)&lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: La profundidad correcta es la mayor. Si te encuentra&lt;br /&gt;
 contraejemplos más adelante es que te has equivocado en los&lt;br /&gt;
 enunciados. Las funciones máximo y mínimo vienen predefinidas&lt;br /&gt;
 ya sin necesidad de definirlas. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
fun pr1 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;pr1 H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;pr1 (N i d) = Suc(max (pr1 i) (pr1 d))&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom,carvelcab, juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot; (*¿Pudiera ser que esta sea más rápida?*)&lt;br /&gt;
fun abc1 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc1 0 = H&amp;quot;&lt;br /&gt;
 |&amp;quot;abc1 (Suc n) = (let a = abc1 n in N a a)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&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 a b) = ((f a = f b) ∧ (es_abc f a ∧ es_abc f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom, carvelcab&amp;quot;&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;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun es_abc3 :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc3 f H = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc3 f (N i d) = ( es_abc3 f i ∧ es_abc3 f d ∧ f i = f d )&amp;quot;&lt;br /&gt;
&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;
text{*Para entenderme he cambiado de función de tamaño, la demostración&lt;br /&gt;
es análoga pero buscando las simplificaciones de size cuando correspondan&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun nodos::&amp;quot;arbol ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;nodos H = 0&amp;quot;&lt;br /&gt;
|&amp;quot;nodos (N i d) = 1+(nodos i)+(nodos d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;size t= nodos t&amp;quot;&lt;br /&gt;
apply (induct t, auto)done&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
value &amp;quot;size (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;
  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;
&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;
text{*Pedrosrei: Los enunciados y demostraciones que vienen a continuación &lt;br /&gt;
son feos y engorrosos. Yo he optado por demostrarlo todo a través de &lt;br /&gt;
una propiedad extraña a la demostración en principio. Animo encarecidamente&lt;br /&gt;
a que pongáis una demostración más corta y directa. Voy explicando paso&lt;br /&gt;
a paso qué he hecho en cada momento. Hecha esta demostración, el resto&lt;br /&gt;
son triviales por una cadena de resultados. &lt;br /&gt;
 No existe relación de implicación en ningún sentido &lt;br /&gt;
 entre hojas y profundidad, como es obvio y muestran los siguientes&lt;br /&gt;
 contraejemplos: *}&lt;br /&gt;
lemma &amp;quot;(((hojas(t1) = hojas(t2)))--&amp;gt;(profundidad(t1) = profundidad(t2)))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) --&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) &amp;lt;-&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {* Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
t1 = N (N H H) (N H H)&lt;br /&gt;
t2 = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
hojas t1 = 4&lt;br /&gt;
hojas t2 = 3&lt;br /&gt;
&lt;br /&gt;
Ahora pongo una serie de resultados auxiliares que ayudarán en la prueba&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
lemma auxprof:&amp;quot;(es_abc profundidad t)∧(profundidad t = n)==&amp;gt; (t= abc n)&amp;quot;&lt;br /&gt;
apply (induct t arbitrary:n, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma eq_1_iff_exp_0:&amp;quot;Suc 0 = 2 ^ n &amp;lt;-&amp;gt; n=0&amp;quot;  apply (cases n, auto) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhojas:&amp;quot;(t= abc n)==&amp;gt; (es_abc hojas t)&amp;quot;&lt;br /&gt;
apply (induct n arbitrary: t, auto simp add: eq_1_iff_exp_0) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhoja:&amp;quot;(t= abc n)==&amp;gt;((hojas t = 2^n))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Y aquí viene la demostración larga y fea que os animo a mejorar.&lt;br /&gt;
He dejado los pasos exactamente que indica el razonador para que &lt;br /&gt;
veáis qué hace en cada caso:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_hoja:&amp;quot;es_abc profundidad t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc hojas t&amp;quot; using auxhojas by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc hojas t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
       hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
         es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
         hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc hojas t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
           hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc hojas t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;hojas t1 = hojas t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc hojas t1&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t1 = (2::nat)^n&amp;quot; using 2 auxhoja by auto&lt;br /&gt;
               hence 3:&amp;quot;hojas t2 =  (2::nat)^n&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc hojas t2&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t2 =  (2::nat)^m&amp;quot; using 5 auxhoja by auto&lt;br /&gt;
               with 3 have &amp;quot; (2::nat)^m =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; apply (induct, auto)done&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: creo que tengo una demostración mas elegante tan&lt;br /&gt;
sólo hace falta encontrar la relacion entre hojas y profundidad*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma a1: &lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = 2^(pr1 a)&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma cpr1_chojas: &amp;quot;es_abc pr1 a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: esta la detallada*)&lt;br /&gt;
--&amp;quot;jeshorcob,caarvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc hojas 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc pr1 (N i d) = &lt;br /&gt;
    (pr1 i = pr1 d ∧ es_abc pr1 i ∧ es_abc pr1 d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (pr1 i = pr1 d ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d &lt;br /&gt;
      ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot; using a1 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc hojas (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;domcadgom&amp;quot;&lt;br /&gt;
lemma aux1: &amp;quot;(es_abc profundidad a) ⟹ (hojas a) =  (2^(profundidad  a))&amp;quot;&lt;br /&gt;
by (induct a,simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo1: &amp;quot;(es_abc (profundidad) a) = (es_abc (hojas) a)&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
  fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc profundidad a1 = es_abc hojas a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc profundidad a2 = es_abc hojas a2&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc profundidad a2 ∧ es_abc profundidad a1 ⟶ es_abc profundidad &lt;br /&gt;
(N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; using a1 a2 by (simp add: aux1)&lt;br /&gt;
  thus &amp;quot;es_abc profundidad (N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed&lt;br /&gt;
&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;
(* Javrodviv1: Bueno yo para este ejercicio he encontrado algo mas sencillo,&lt;br /&gt;
    tan solo hay que encontrar una relación de igualdad entre hojas y size,&lt;br /&gt;
    que para este caso es sencillo.*)&lt;br /&gt;
-- &amp;quot;Javrodviv1,carvelcab&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma hojasize_igualdad: &lt;br /&gt;
      &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
by (induct x, simp_all)&lt;br /&gt;
&lt;br /&gt;
(*lemma &amp;quot;es_abc size a &amp;lt;-&amp;gt; es_abc hojas a&amp;quot; Son equivalentes = es lo mismo que &amp;lt;-&amp;gt; &lt;br /&gt;
    matemáticamente hablando*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot; es_abc size a = es_abc hojas a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
by (induct a, simp_all add: hojasize_igualdad)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Aquí dejo esta. Es trivial debido a la demostración anterior,&lt;br /&gt;
sólo hace falta coger el mismo desvío. Aquí sí que podéis encontrar&lt;br /&gt;
una mucho más directa: *}&lt;br /&gt;
&lt;br /&gt;
lemma auxnodo:&amp;quot;(t= abc n)==&amp;gt;(es_abc nodos t)∧(nodos t = (2^n - 1))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma nodos_eq_hoja:&amp;quot;es_abc nodos t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof -&lt;br /&gt;
have 1:&amp;quot;es_abc hojas t &amp;lt;-&amp;gt; es_abc profundidad t&amp;quot; using prof_eq_hoja by auto&lt;br /&gt;
hence 2:&amp;quot;?P t = (es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot; by auto&lt;br /&gt;
have &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
with 1 2 show ?thesis by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: aquí similar*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma a2: &lt;br /&gt;
  assumes &amp;quot;es_abc size a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma chojas_cnodos: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a2)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc hojas a = es_abc size 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc hojas (N i d) = &lt;br /&gt;
    (hojas i = hojas d ∧ es_abc hojas i ∧ es_abc hojas d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d ∧ es_abc size i ∧ es_abc size d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (size i = size d &lt;br /&gt;
      ∧ es_abc size i ∧ es_abc size d)&amp;quot; using a2 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc size (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma aux2: &amp;quot;(es_abc size a) ⟹ ((hojas a) = ((size a) +1))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo2: &amp;quot;es_abc hojas a = es_abc (size) a&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
 fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc hojas a1 = es_abc size a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc hojas a2 = es_abc size a2&amp;quot;&lt;br /&gt;
  hence &amp;quot;es_abc size a2 ∧ es_abc size a1 ⟶ &lt;br /&gt;
es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; using a1 by (simp add: aux2)&lt;br /&gt;
  thus &amp;quot;es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* numero de hojas es size + 1 *)&lt;br /&gt;
lemma l_hojas_size: &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
show &amp;quot; hojas H = size H + 1&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
fix x1 x2&lt;br /&gt;
assume h1:&amp;quot;hojas x1 = size x1 + 1&amp;quot;&lt;br /&gt;
assume h2:&amp;quot;hojas x2 = size x2 + 1&amp;quot;&lt;br /&gt;
have &amp;quot;hojas (N x1 x2) =  hojas x1 + hojas x2&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size x1 + 1 + size x2 + 1&amp;quot; using h1 h2 by simp&lt;br /&gt;
also have &amp;quot;... =  (1 + size x1 + size x2) + 1&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size (N x1 x2) + 1&amp;quot; by simp&lt;br /&gt;
finally show  &amp;quot;hojas (N x1 x2) = size (N x1 x2) + 1&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* usando lema anterior *)&lt;br /&gt;
lemma rel_size_igualdad: &amp;quot; es_abc size  a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: l_hojas_size)&lt;br /&gt;
&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;
text {* Pedrosrei. De hecho, esta es una parte de la anterior: *}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_nodos: &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: sale directo como corolario de los anteriores*)&lt;br /&gt;
--&amp;quot;jeshorcob,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc size a&amp;quot;&lt;br /&gt;
using cpr1_chojas and chojas_cnodos by simp_all&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary completo3: &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
 using completo1 completo2 by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*&lt;br /&gt;
1.- En apartado 7 se demuestra que:&lt;br /&gt;
  es_abc profundidad a ⟷ es_abc hojas a&lt;br /&gt;
2.- En apartado 8 se demuestra que:&lt;br /&gt;
                           es_abc hojas a ⟷ es_abc size  a &lt;br /&gt;
3.- Luego podremos demostrar usando las anteriores:&lt;br /&gt;
    es_abc profundidad a ⟷ es_abc size  a &lt;br /&gt;
&lt;br /&gt;
Nota: Para apartado 7 uso demostración de &amp;quot;jeshorcob y carvelcab&amp;quot;, que&lt;br /&gt;
no he conseguido reproducir *) &lt;br /&gt;
lemma &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
using profundidad_y_hojas_completo rel_size_igualdad by simp_all&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot; es_abc f (abc n)&amp;quot;&lt;br /&gt;
apply (induct n, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &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 n assume h: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (f (abc n) = f (abc n) ∧ &lt;br /&gt;
    es_abc f (abc n) ∧ es_abc f (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using h by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; 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 (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ==&amp;gt; (a= abc (profundidad a))&amp;quot;&lt;br /&gt;
apply (induct a, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a ⟹ (a = abc (pr1 a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟹ (a = abc (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc nodos&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {*&lt;br /&gt;
El contraejemplo no es más que una medida constante, la trivial:&lt;br /&gt;
&lt;br /&gt;
Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇣1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc R8_Arboles_binarios_completos.size x = False&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: usando size en lugar de nodos, se encuentra el&lt;br /&gt;
mismo contraejemplo*)&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc size&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(*&lt;br /&gt;
el contraejemplo es:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇩1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc size x = False&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f t = es_abc size t&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=228</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=228"/>
		<updated>2014-12-16T09:29:43Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R8: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Arboles_binarios_completos&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 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)&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;
&lt;br /&gt;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom, carvelcab, juacorvic&amp;quot;&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 i d) = hojas i + hojas d&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun max :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;max a b= (if a≥ b then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;max 6 3&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, carvelcab, juacorvic&amp;quot;&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 a b) = 1 + max (profundidad a) (profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Explico estas dos funciones, la que utilizo para los &lt;br /&gt;
  lemas de abajo es profundidad ya que profundidad1 me encuentra&lt;br /&gt;
  contraejemplos y para evitar eso busque definir profundidad&lt;br /&gt;
  definidad de manera distinta. No obstante la que a mi me parece&lt;br /&gt;
  mas sensata para definir la profundidad de un árbol es la &lt;br /&gt;
  profundidad1 *)&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Fallo mio ya lo corregí*)&lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: La profundidad correcta es la mayor. Si te encuentra&lt;br /&gt;
 contraejemplos más adelante es que te has equivocado en los&lt;br /&gt;
 enunciados. Las funciones máximo y mínimo vienen predefinidas&lt;br /&gt;
 ya sin necesidad de definirlas. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
fun pr1 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;pr1 H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;pr1 (N i d) = Suc(max (pr1 i) (pr1 d))&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom,carvelcab, juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot; (*¿Pudiera ser que esta sea más rápida?*)&lt;br /&gt;
fun abc1 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc1 0 = H&amp;quot;&lt;br /&gt;
 |&amp;quot;abc1 (Suc n) = (let a = abc1 n in N a a)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&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 a b) = ((f a = f b) ∧ (es_abc f a ∧ es_abc f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom, carvelcab&amp;quot;&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;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun es_abc3 :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc3 f H = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc3 f (N i d) = ( es_abc3 f i ∧ es_abc3 f d ∧ f i = f d )&amp;quot;&lt;br /&gt;
&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;
text{*Para entenderme he cambiado de función de tamaño, la demostración&lt;br /&gt;
es análoga pero buscando las simplificaciones de size cuando correspondan&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun nodos::&amp;quot;arbol ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;nodos H = 0&amp;quot;&lt;br /&gt;
|&amp;quot;nodos (N i d) = 1+(nodos i)+(nodos d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;size t= nodos t&amp;quot;&lt;br /&gt;
apply (induct t, auto)done&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
value &amp;quot;size (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;
  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;
&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;
text{*Pedrosrei: Los enunciados y demostraciones que vienen a continuación &lt;br /&gt;
son feos y engorrosos. Yo he optado por demostrarlo todo a través de &lt;br /&gt;
una propiedad extraña a la demostración en principio. Animo encarecidamente&lt;br /&gt;
a que pongáis una demostración más corta y directa. Voy explicando paso&lt;br /&gt;
a paso qué he hecho en cada momento. Hecha esta demostración, el resto&lt;br /&gt;
son triviales por una cadena de resultados. &lt;br /&gt;
 No existe relación de implicación en ningún sentido &lt;br /&gt;
 entre hojas y profundidad, como es obvio y muestran los siguientes&lt;br /&gt;
 contraejemplos: *}&lt;br /&gt;
lemma &amp;quot;(((hojas(t1) = hojas(t2)))--&amp;gt;(profundidad(t1) = profundidad(t2)))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) --&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) &amp;lt;-&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {* Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
t1 = N (N H H) (N H H)&lt;br /&gt;
t2 = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
hojas t1 = 4&lt;br /&gt;
hojas t2 = 3&lt;br /&gt;
&lt;br /&gt;
Ahora pongo una serie de resultados auxiliares que ayudarán en la prueba&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
lemma auxprof:&amp;quot;(es_abc profundidad t)∧(profundidad t = n)==&amp;gt; (t= abc n)&amp;quot;&lt;br /&gt;
apply (induct t arbitrary:n, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma eq_1_iff_exp_0:&amp;quot;Suc 0 = 2 ^ n &amp;lt;-&amp;gt; n=0&amp;quot;  apply (cases n, auto) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhojas:&amp;quot;(t= abc n)==&amp;gt; (es_abc hojas t)&amp;quot;&lt;br /&gt;
apply (induct n arbitrary: t, auto simp add: eq_1_iff_exp_0) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhoja:&amp;quot;(t= abc n)==&amp;gt;((hojas t = 2^n))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Y aquí viene la demostración larga y fea que os animo a mejorar.&lt;br /&gt;
He dejado los pasos exactamente que indica el razonador para que &lt;br /&gt;
veáis qué hace en cada caso:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_hoja:&amp;quot;es_abc profundidad t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc hojas t&amp;quot; using auxhojas by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc hojas t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
       hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
         es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
         hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc hojas t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
           hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc hojas t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;hojas t1 = hojas t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc hojas t1&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t1 = (2::nat)^n&amp;quot; using 2 auxhoja by auto&lt;br /&gt;
               hence 3:&amp;quot;hojas t2 =  (2::nat)^n&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc hojas t2&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t2 =  (2::nat)^m&amp;quot; using 5 auxhoja by auto&lt;br /&gt;
               with 3 have &amp;quot; (2::nat)^m =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; apply (induct, auto)done&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: creo que tengo una demostración mas elegante tan&lt;br /&gt;
sólo hace falta encontrar la relacion entre hojas y profundidad*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma a1: &lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = 2^(pr1 a)&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma cpr1_chojas: &amp;quot;es_abc pr1 a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: esta la detallada*)&lt;br /&gt;
--&amp;quot;jeshorcob,caarvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc hojas 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc pr1 (N i d) = &lt;br /&gt;
    (pr1 i = pr1 d ∧ es_abc pr1 i ∧ es_abc pr1 d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (pr1 i = pr1 d ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d &lt;br /&gt;
      ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot; using a1 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc hojas (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;domcadgom&amp;quot;&lt;br /&gt;
lemma aux1: &amp;quot;(es_abc profundidad a) ⟹ (hojas a) =  (2^(profundidad  a))&amp;quot;&lt;br /&gt;
by (induct a,simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo1: &amp;quot;(es_abc (profundidad) a) = (es_abc (hojas) a)&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
  fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc profundidad a1 = es_abc hojas a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc profundidad a2 = es_abc hojas a2&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc profundidad a2 ∧ es_abc profundidad a1 ⟶ es_abc profundidad &lt;br /&gt;
(N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; using a1 a2 by (simp add: aux1)&lt;br /&gt;
  thus &amp;quot;es_abc profundidad (N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed&lt;br /&gt;
&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;
(* Javrodviv1: Bueno yo para este ejercicio he encontrado algo mas sencillo,&lt;br /&gt;
    tan solo hay que encontrar una relación de igualdad entre hojas y size,&lt;br /&gt;
    que para este caso es sencillo.*)&lt;br /&gt;
-- &amp;quot;Javrodviv1,carvelcab&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma hojasize_igualdad: &lt;br /&gt;
      &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
by (induct x, simp_all)&lt;br /&gt;
&lt;br /&gt;
(*lemma &amp;quot;es_abc size a &amp;lt;-&amp;gt; es_abc hojas a&amp;quot; Son equivalentes = es lo mismo que &amp;lt;-&amp;gt; &lt;br /&gt;
    matemáticamente hablando*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot; es_abc size a = es_abc hojas a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
by (induct a, simp_all add: hojasize_igualdad)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Aquí dejo esta. Es trivial debido a la demostración anterior,&lt;br /&gt;
sólo hace falta coger el mismo desvío. Aquí sí que podéis encontrar&lt;br /&gt;
una mucho más directa: *}&lt;br /&gt;
&lt;br /&gt;
lemma auxnodo:&amp;quot;(t= abc n)==&amp;gt;(es_abc nodos t)∧(nodos t = (2^n - 1))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma nodos_eq_hoja:&amp;quot;es_abc nodos t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof -&lt;br /&gt;
have 1:&amp;quot;es_abc hojas t &amp;lt;-&amp;gt; es_abc profundidad t&amp;quot; using prof_eq_hoja by auto&lt;br /&gt;
hence 2:&amp;quot;?P t = (es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot; by auto&lt;br /&gt;
have &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
with 1 2 show ?thesis by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: aquí similar*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma a2: &lt;br /&gt;
  assumes &amp;quot;es_abc size a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma chojas_cnodos: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a2)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc hojas a = es_abc size 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc hojas (N i d) = &lt;br /&gt;
    (hojas i = hojas d ∧ es_abc hojas i ∧ es_abc hojas d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d ∧ es_abc size i ∧ es_abc size d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (size i = size d &lt;br /&gt;
      ∧ es_abc size i ∧ es_abc size d)&amp;quot; using a2 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc size (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma aux2: &amp;quot;(es_abc size a) ⟹ ((hojas a) = ((size a) +1))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo2: &amp;quot;es_abc hojas a = es_abc (size) a&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
 fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc hojas a1 = es_abc size a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc hojas a2 = es_abc size a2&amp;quot;&lt;br /&gt;
  hence &amp;quot;es_abc size a2 ∧ es_abc size a1 ⟶ &lt;br /&gt;
es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; using a1 by (simp add: aux2)&lt;br /&gt;
  thus &amp;quot;es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* numero de hojas es size + 1 *)&lt;br /&gt;
lemma l_hojas_size: &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
show &amp;quot; hojas H = size H + 1&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
fix x1 x2&lt;br /&gt;
assume h1:&amp;quot;hojas x1 = size x1 + 1&amp;quot;&lt;br /&gt;
assume h2:&amp;quot;hojas x2 = size x2 + 1&amp;quot;&lt;br /&gt;
have &amp;quot;hojas (N x1 x2) =  hojas x1 + hojas x2&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size x1 + 1 + size x2 + 1&amp;quot; using h1 h2 by simp&lt;br /&gt;
also have &amp;quot;... =  (1 + size x1 + size x2) + 1&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = size (N x1 x2) + 1&amp;quot; by simp&lt;br /&gt;
finally show  &amp;quot;hojas (N x1 x2) = size (N x1 x2) + 1&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* usando lema anterior *)&lt;br /&gt;
lemma rel_size_igualdad: &amp;quot; es_abc size  a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: l_hojas_size)&lt;br /&gt;
&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;
text {* Pedrosrei. De hecho, esta es una parte de la anterior: *}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_nodos: &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: sale directo como corolario de los anteriores*)&lt;br /&gt;
--&amp;quot;jeshorcob,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc size a&amp;quot;&lt;br /&gt;
using cpr1_chojas and chojas_cnodos by simp_all&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary completo3: &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
 using completo1 completo2 by simp&lt;br /&gt;
&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot; es_abc f (abc n)&amp;quot;&lt;br /&gt;
apply (induct n, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &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 n assume h: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (f (abc n) = f (abc n) ∧ &lt;br /&gt;
    es_abc f (abc n) ∧ es_abc f (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using h by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; 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 (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ==&amp;gt; (a= abc (profundidad a))&amp;quot;&lt;br /&gt;
apply (induct a, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a ⟹ (a = abc (pr1 a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟹ (a = abc (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc nodos&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {*&lt;br /&gt;
El contraejemplo no es más que una medida constante, la trivial:&lt;br /&gt;
&lt;br /&gt;
Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇣1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc R8_Arboles_binarios_completos.size x = False&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: usando size en lugar de nodos, se encuentra el&lt;br /&gt;
mismo contraejemplo*)&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc size&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(*&lt;br /&gt;
el contraejemplo es:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇩1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc size x = False&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f t = es_abc size t&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=227</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=227"/>
		<updated>2014-12-15T11:12:19Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R8: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Arboles_binarios_completos&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 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)&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;
&lt;br /&gt;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom, carvelcab, juacorvic&amp;quot;&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 i d) = hojas i + hojas d&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun max :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;max a b= (if a≥ b then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;max 6 3&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, carvelcab, juacorvic&amp;quot;&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 a b) = 1 + max (profundidad a) (profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Explico estas dos funciones, la que utilizo para los &lt;br /&gt;
  lemas de abajo es profundidad ya que profundidad1 me encuentra&lt;br /&gt;
  contraejemplos y para evitar eso busque definir profundidad&lt;br /&gt;
  definidad de manera distinta. No obstante la que a mi me parece&lt;br /&gt;
  mas sensata para definir la profundidad de un árbol es la &lt;br /&gt;
  profundidad1 *)&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Fallo mio ya lo corregí*)&lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: La profundidad correcta es la mayor. Si te encuentra&lt;br /&gt;
 contraejemplos más adelante es que te has equivocado en los&lt;br /&gt;
 enunciados. Las funciones máximo y mínimo vienen predefinidas&lt;br /&gt;
 ya sin necesidad de definirlas. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
fun pr1 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;pr1 H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;pr1 (N i d) = Suc(max (pr1 i) (pr1 d))&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom,carvelcab, juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot; (*¿Pudiera ser que esta sea más rápida?*)&lt;br /&gt;
fun abc1 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc1 0 = H&amp;quot;&lt;br /&gt;
 |&amp;quot;abc1 (Suc n) = (let a = abc1 n in N a a)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&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 a b) = ((f a = f b) ∧ (es_abc f a ∧ es_abc f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom, carvelcab&amp;quot;&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;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun es_abc3 :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc3 f H = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc3 f (N i d) = ( es_abc3 f i ∧ es_abc3 f d ∧ f i = f d )&amp;quot;&lt;br /&gt;
&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;
text{*Para entenderme he cambiado de función de tamaño, la demostración&lt;br /&gt;
es análoga pero buscando las simplificaciones de size cuando correspondan&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun nodos::&amp;quot;arbol ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;nodos H = 0&amp;quot;&lt;br /&gt;
|&amp;quot;nodos (N i d) = 1+(nodos i)+(nodos d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;size t= nodos t&amp;quot;&lt;br /&gt;
apply (induct t, auto)done&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
value &amp;quot;size (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;
  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;
&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;
text{*Pedrosrei: Los enunciados y demostraciones que vienen a continuación &lt;br /&gt;
son feos y engorrosos. Yo he optado por demostrarlo todo a través de &lt;br /&gt;
una propiedad extraña a la demostración en principio. Animo encarecidamente&lt;br /&gt;
a que pongáis una demostración más corta y directa. Voy explicando paso&lt;br /&gt;
a paso qué he hecho en cada momento. Hecha esta demostración, el resto&lt;br /&gt;
son triviales por una cadena de resultados. &lt;br /&gt;
 No existe relación de implicación en ningún sentido &lt;br /&gt;
 entre hojas y profundidad, como es obvio y muestran los siguientes&lt;br /&gt;
 contraejemplos: *}&lt;br /&gt;
lemma &amp;quot;(((hojas(t1) = hojas(t2)))--&amp;gt;(profundidad(t1) = profundidad(t2)))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) --&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) &amp;lt;-&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {* Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
t1 = N (N H H) (N H H)&lt;br /&gt;
t2 = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
hojas t1 = 4&lt;br /&gt;
hojas t2 = 3&lt;br /&gt;
&lt;br /&gt;
Ahora pongo una serie de resultados auxiliares que ayudarán en la prueba&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
lemma auxprof:&amp;quot;(es_abc profundidad t)∧(profundidad t = n)==&amp;gt; (t= abc n)&amp;quot;&lt;br /&gt;
apply (induct t arbitrary:n, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma eq_1_iff_exp_0:&amp;quot;Suc 0 = 2 ^ n &amp;lt;-&amp;gt; n=0&amp;quot;  apply (cases n, auto) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhojas:&amp;quot;(t= abc n)==&amp;gt; (es_abc hojas t)&amp;quot;&lt;br /&gt;
apply (induct n arbitrary: t, auto simp add: eq_1_iff_exp_0) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhoja:&amp;quot;(t= abc n)==&amp;gt;((hojas t = 2^n))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Y aquí viene la demostración larga y fea que os animo a mejorar.&lt;br /&gt;
He dejado los pasos exactamente que indica el razonador para que &lt;br /&gt;
veáis qué hace en cada caso:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_hoja:&amp;quot;es_abc profundidad t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc hojas t&amp;quot; using auxhojas by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc hojas t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
       hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
         es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
         hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc hojas t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
           hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc hojas t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;hojas t1 = hojas t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc hojas t1&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t1 = (2::nat)^n&amp;quot; using 2 auxhoja by auto&lt;br /&gt;
               hence 3:&amp;quot;hojas t2 =  (2::nat)^n&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc hojas t2&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t2 =  (2::nat)^m&amp;quot; using 5 auxhoja by auto&lt;br /&gt;
               with 3 have &amp;quot; (2::nat)^m =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; apply (induct, auto)done&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: creo que tengo una demostración mas elegante tan&lt;br /&gt;
sólo hace falta encontrar la relacion entre hojas y profundidad*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma a1: &lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = 2^(pr1 a)&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma cpr1_chojas: &amp;quot;es_abc pr1 a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: esta la detallada*)&lt;br /&gt;
--&amp;quot;jeshorcob,caarvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc hojas 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc pr1 (N i d) = &lt;br /&gt;
    (pr1 i = pr1 d ∧ es_abc pr1 i ∧ es_abc pr1 d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (pr1 i = pr1 d ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d &lt;br /&gt;
      ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot; using a1 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc hojas (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;domcadgom&amp;quot;&lt;br /&gt;
lemma aux1: &amp;quot;(es_abc profundidad a) ⟹ (hojas a) =  (2^(profundidad  a))&amp;quot;&lt;br /&gt;
by (induct a,simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo1: &amp;quot;(es_abc (profundidad) a) = (es_abc (hojas) a)&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
  fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc profundidad a1 = es_abc hojas a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc profundidad a2 = es_abc hojas a2&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc profundidad a2 ∧ es_abc profundidad a1 ⟶ es_abc profundidad &lt;br /&gt;
(N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; using a1 a2 by (simp add: aux1)&lt;br /&gt;
  thus &amp;quot;es_abc profundidad (N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed&lt;br /&gt;
&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;
(* Javrodviv1: Bueno yo para este ejercicio he encontrado algo mas sencillo,&lt;br /&gt;
    tan solo hay que encontrar una relación de igualdad entre hojas y size,&lt;br /&gt;
    que para este caso es sencillo.*)&lt;br /&gt;
-- &amp;quot;Javrodviv1,carvelcab&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma hojasize_igualdad: &lt;br /&gt;
      &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
by (induct x, simp_all)&lt;br /&gt;
&lt;br /&gt;
(*lemma &amp;quot;es_abc size a &amp;lt;-&amp;gt; es_abc hojas a&amp;quot; Son equivalentes = es lo mismo que &amp;lt;-&amp;gt; &lt;br /&gt;
    matemáticamente hablando*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot; es_abc size a = es_abc hojas a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
by (induct a, simp_all add: hojasize_igualdad)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Aquí dejo esta. Es trivial debido a la demostración anterior,&lt;br /&gt;
sólo hace falta coger el mismo desvío. Aquí sí que podéis encontrar&lt;br /&gt;
una mucho más directa: *}&lt;br /&gt;
&lt;br /&gt;
lemma auxnodo:&amp;quot;(t= abc n)==&amp;gt;(es_abc nodos t)∧(nodos t = (2^n - 1))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma nodos_eq_hoja:&amp;quot;es_abc nodos t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof -&lt;br /&gt;
have 1:&amp;quot;es_abc hojas t &amp;lt;-&amp;gt; es_abc profundidad t&amp;quot; using prof_eq_hoja by auto&lt;br /&gt;
hence 2:&amp;quot;?P t = (es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot; by auto&lt;br /&gt;
have &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
with 1 2 show ?thesis by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: aquí similar*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma a2: &lt;br /&gt;
  assumes &amp;quot;es_abc size a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma chojas_cnodos: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a2)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc hojas a = es_abc size 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc hojas (N i d) = &lt;br /&gt;
    (hojas i = hojas d ∧ es_abc hojas i ∧ es_abc hojas d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d ∧ es_abc size i ∧ es_abc size d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (size i = size d &lt;br /&gt;
      ∧ es_abc size i ∧ es_abc size d)&amp;quot; using a2 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc size (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma aux2: &amp;quot;(es_abc size a) ⟹ ((hojas a) = ((size a) +1))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo2: &amp;quot;es_abc hojas a = es_abc (size) a&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
 fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc hojas a1 = es_abc size a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc hojas a2 = es_abc size a2&amp;quot;&lt;br /&gt;
  hence &amp;quot;es_abc size a2 ∧ es_abc size a1 ⟶ &lt;br /&gt;
es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; using a1 by (simp add: aux2)&lt;br /&gt;
  thus &amp;quot;es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed &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;
text {* Pedrosrei. De hecho, esta es una parte de la anterior: *}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_nodos: &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: sale directo como corolario de los anteriores*)&lt;br /&gt;
--&amp;quot;jeshorcob,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc size a&amp;quot;&lt;br /&gt;
using cpr1_chojas and chojas_cnodos by simp_all&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary completo3: &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
 using completo1 completo2 by simp&lt;br /&gt;
&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot; es_abc f (abc n)&amp;quot;&lt;br /&gt;
apply (induct n, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &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 n assume h: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (f (abc n) = f (abc n) ∧ &lt;br /&gt;
    es_abc f (abc n) ∧ es_abc f (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using h by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; 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 (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ==&amp;gt; (a= abc (profundidad a))&amp;quot;&lt;br /&gt;
apply (induct a, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a ⟹ (a = abc (pr1 a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟹ (a = abc (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc nodos&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {*&lt;br /&gt;
El contraejemplo no es más que una medida constante, la trivial:&lt;br /&gt;
&lt;br /&gt;
Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇣1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc R8_Arboles_binarios_completos.size x = False&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: usando size en lugar de nodos, se encuentra el&lt;br /&gt;
mismo contraejemplo*)&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc size&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(*&lt;br /&gt;
el contraejemplo es:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇩1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc size x = False&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f t = es_abc size t&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=226</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=226"/>
		<updated>2014-12-15T11:02:20Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R8: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Arboles_binarios_completos&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 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)&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;
&lt;br /&gt;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom, carvelcab, juacorvic&amp;quot;&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 i d) = hojas i + hojas d&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun max :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;max a b= (if a≥ b then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;max 6 3&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, carvelcab, juacorvic&amp;quot;&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 a b) = 1 + max (profundidad a) (profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Explico estas dos funciones, la que utilizo para los &lt;br /&gt;
  lemas de abajo es profundidad ya que profundidad1 me encuentra&lt;br /&gt;
  contraejemplos y para evitar eso busque definir profundidad&lt;br /&gt;
  definidad de manera distinta. No obstante la que a mi me parece&lt;br /&gt;
  mas sensata para definir la profundidad de un árbol es la &lt;br /&gt;
  profundidad1 *)&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Fallo mio ya lo corregí*)&lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: La profundidad correcta es la mayor. Si te encuentra&lt;br /&gt;
 contraejemplos más adelante es que te has equivocado en los&lt;br /&gt;
 enunciados. Las funciones máximo y mínimo vienen predefinidas&lt;br /&gt;
 ya sin necesidad de definirlas. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
fun pr1 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;pr1 H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;pr1 (N i d) = Suc(max (pr1 i) (pr1 d))&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom,carvelcab, juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot; (*¿Pudiera ser que esta sea más rápida?*)&lt;br /&gt;
fun abc1 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc1 0 = H&amp;quot;&lt;br /&gt;
 |&amp;quot;abc1 (Suc n) = (let a = abc1 n in N a a)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&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 a b) = ((f a = f b) ∧ (es_abc f a ∧ es_abc f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom, carvelcab&amp;quot;&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;
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;
text{*Para entenderme he cambiado de función de tamaño, la demostración&lt;br /&gt;
es análoga pero buscando las simplificaciones de size cuando correspondan&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun nodos::&amp;quot;arbol ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;nodos H = 0&amp;quot;&lt;br /&gt;
|&amp;quot;nodos (N i d) = 1+(nodos i)+(nodos d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;size t= nodos t&amp;quot;&lt;br /&gt;
apply (induct t, auto)done&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
value &amp;quot;size (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;
  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;
&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;
text{*Pedrosrei: Los enunciados y demostraciones que vienen a continuación &lt;br /&gt;
son feos y engorrosos. Yo he optado por demostrarlo todo a través de &lt;br /&gt;
una propiedad extraña a la demostración en principio. Animo encarecidamente&lt;br /&gt;
a que pongáis una demostración más corta y directa. Voy explicando paso&lt;br /&gt;
a paso qué he hecho en cada momento. Hecha esta demostración, el resto&lt;br /&gt;
son triviales por una cadena de resultados. &lt;br /&gt;
 No existe relación de implicación en ningún sentido &lt;br /&gt;
 entre hojas y profundidad, como es obvio y muestran los siguientes&lt;br /&gt;
 contraejemplos: *}&lt;br /&gt;
lemma &amp;quot;(((hojas(t1) = hojas(t2)))--&amp;gt;(profundidad(t1) = profundidad(t2)))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) --&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) &amp;lt;-&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {* Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
t1 = N (N H H) (N H H)&lt;br /&gt;
t2 = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
hojas t1 = 4&lt;br /&gt;
hojas t2 = 3&lt;br /&gt;
&lt;br /&gt;
Ahora pongo una serie de resultados auxiliares que ayudarán en la prueba&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
lemma auxprof:&amp;quot;(es_abc profundidad t)∧(profundidad t = n)==&amp;gt; (t= abc n)&amp;quot;&lt;br /&gt;
apply (induct t arbitrary:n, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma eq_1_iff_exp_0:&amp;quot;Suc 0 = 2 ^ n &amp;lt;-&amp;gt; n=0&amp;quot;  apply (cases n, auto) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhojas:&amp;quot;(t= abc n)==&amp;gt; (es_abc hojas t)&amp;quot;&lt;br /&gt;
apply (induct n arbitrary: t, auto simp add: eq_1_iff_exp_0) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhoja:&amp;quot;(t= abc n)==&amp;gt;((hojas t = 2^n))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Y aquí viene la demostración larga y fea que os animo a mejorar.&lt;br /&gt;
He dejado los pasos exactamente que indica el razonador para que &lt;br /&gt;
veáis qué hace en cada caso:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_hoja:&amp;quot;es_abc profundidad t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc hojas t&amp;quot; using auxhojas by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc hojas t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
       hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
         es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
         hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc hojas t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
           hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc hojas t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;hojas t1 = hojas t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc hojas t1&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t1 = (2::nat)^n&amp;quot; using 2 auxhoja by auto&lt;br /&gt;
               hence 3:&amp;quot;hojas t2 =  (2::nat)^n&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc hojas t2&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t2 =  (2::nat)^m&amp;quot; using 5 auxhoja by auto&lt;br /&gt;
               with 3 have &amp;quot; (2::nat)^m =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; apply (induct, auto)done&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: creo que tengo una demostración mas elegante tan&lt;br /&gt;
sólo hace falta encontrar la relacion entre hojas y profundidad*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma a1: &lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = 2^(pr1 a)&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma cpr1_chojas: &amp;quot;es_abc pr1 a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: esta la detallada*)&lt;br /&gt;
--&amp;quot;jeshorcob,caarvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc hojas 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc pr1 (N i d) = &lt;br /&gt;
    (pr1 i = pr1 d ∧ es_abc pr1 i ∧ es_abc pr1 d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (pr1 i = pr1 d ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d &lt;br /&gt;
      ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot; using a1 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc hojas (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;domcadgom&amp;quot;&lt;br /&gt;
lemma aux1: &amp;quot;(es_abc profundidad a) ⟹ (hojas a) =  (2^(profundidad  a))&amp;quot;&lt;br /&gt;
by (induct a,simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo1: &amp;quot;(es_abc (profundidad) a) = (es_abc (hojas) a)&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
  fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc profundidad a1 = es_abc hojas a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc profundidad a2 = es_abc hojas a2&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc profundidad a2 ∧ es_abc profundidad a1 ⟶ es_abc profundidad &lt;br /&gt;
(N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; using a1 a2 by (simp add: aux1)&lt;br /&gt;
  thus &amp;quot;es_abc profundidad (N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed&lt;br /&gt;
&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;
(* Javrodviv1: Bueno yo para este ejercicio he encontrado algo mas sencillo,&lt;br /&gt;
    tan solo hay que encontrar una relación de igualdad entre hojas y size,&lt;br /&gt;
    que para este caso es sencillo.*)&lt;br /&gt;
-- &amp;quot;Javrodviv1,carvelcab&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma hojasize_igualdad: &lt;br /&gt;
      &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
by (induct x, simp_all)&lt;br /&gt;
&lt;br /&gt;
(*lemma &amp;quot;es_abc size a &amp;lt;-&amp;gt; es_abc hojas a&amp;quot; Son equivalentes = es lo mismo que &amp;lt;-&amp;gt; &lt;br /&gt;
    matemáticamente hablando*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot; es_abc size a = es_abc hojas a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
by (induct a, simp_all add: hojasize_igualdad)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Aquí dejo esta. Es trivial debido a la demostración anterior,&lt;br /&gt;
sólo hace falta coger el mismo desvío. Aquí sí que podéis encontrar&lt;br /&gt;
una mucho más directa: *}&lt;br /&gt;
&lt;br /&gt;
lemma auxnodo:&amp;quot;(t= abc n)==&amp;gt;(es_abc nodos t)∧(nodos t = (2^n - 1))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma nodos_eq_hoja:&amp;quot;es_abc nodos t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof -&lt;br /&gt;
have 1:&amp;quot;es_abc hojas t &amp;lt;-&amp;gt; es_abc profundidad t&amp;quot; using prof_eq_hoja by auto&lt;br /&gt;
hence 2:&amp;quot;?P t = (es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot; by auto&lt;br /&gt;
have &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
with 1 2 show ?thesis by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: aquí similar*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma a2: &lt;br /&gt;
  assumes &amp;quot;es_abc size a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma chojas_cnodos: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a2)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc hojas a = es_abc size 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc hojas (N i d) = &lt;br /&gt;
    (hojas i = hojas d ∧ es_abc hojas i ∧ es_abc hojas d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d ∧ es_abc size i ∧ es_abc size d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (size i = size d &lt;br /&gt;
      ∧ es_abc size i ∧ es_abc size d)&amp;quot; using a2 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc size (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma aux2: &amp;quot;(es_abc size a) ⟹ ((hojas a) = ((size a) +1))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo2: &amp;quot;es_abc hojas a = es_abc (size) a&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
 fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc hojas a1 = es_abc size a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc hojas a2 = es_abc size a2&amp;quot;&lt;br /&gt;
  hence &amp;quot;es_abc size a2 ∧ es_abc size a1 ⟶ &lt;br /&gt;
es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; using a1 by (simp add: aux2)&lt;br /&gt;
  thus &amp;quot;es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed &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;
text {* Pedrosrei. De hecho, esta es una parte de la anterior: *}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_nodos: &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: sale directo como corolario de los anteriores*)&lt;br /&gt;
--&amp;quot;jeshorcob,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc size a&amp;quot;&lt;br /&gt;
using cpr1_chojas and chojas_cnodos by simp_all&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary completo3: &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
 using completo1 completo2 by simp&lt;br /&gt;
&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot; es_abc f (abc n)&amp;quot;&lt;br /&gt;
apply (induct n, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &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 n assume h: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (f (abc n) = f (abc n) ∧ &lt;br /&gt;
    es_abc f (abc n) ∧ es_abc f (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using h by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; 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 (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ==&amp;gt; (a= abc (profundidad a))&amp;quot;&lt;br /&gt;
apply (induct a, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a ⟹ (a = abc (pr1 a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟹ (a = abc (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc nodos&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {*&lt;br /&gt;
El contraejemplo no es más que una medida constante, la trivial:&lt;br /&gt;
&lt;br /&gt;
Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇣1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc R8_Arboles_binarios_completos.size x = False&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: usando size en lugar de nodos, se encuentra el&lt;br /&gt;
mismo contraejemplo*)&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc size&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(*&lt;br /&gt;
el contraejemplo es:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇩1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc size x = False&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f t = es_abc size t&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=225</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=225"/>
		<updated>2014-12-15T10:55:36Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R8: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Arboles_binarios_completos&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 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)&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;
&lt;br /&gt;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom, carvelcab, juacorvic&amp;quot;&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 i d) = hojas i + hojas d&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun max :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;max a b= (if a≥ b then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;max 6 3&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, carvelcab, juacorvic&amp;quot;&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 a b) = 1 + max (profundidad a) (profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H))&amp;quot; -- &amp;quot;= 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Explico estas dos funciones, la que utilizo para los &lt;br /&gt;
  lemas de abajo es profundidad ya que profundidad1 me encuentra&lt;br /&gt;
  contraejemplos y para evitar eso busque definir profundidad&lt;br /&gt;
  definidad de manera distinta. No obstante la que a mi me parece&lt;br /&gt;
  mas sensata para definir la profundidad de un árbol es la &lt;br /&gt;
  profundidad1 *)&lt;br /&gt;
&lt;br /&gt;
(* Javrodviv1: Fallo mio ya lo corregí*)&lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: La profundidad correcta es la mayor. Si te encuentra&lt;br /&gt;
 contraejemplos más adelante es que te has equivocado en los&lt;br /&gt;
 enunciados. Las funciones máximo y mínimo vienen predefinidas&lt;br /&gt;
 ya sin necesidad de definirlas. *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
fun pr1 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;pr1 H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;pr1 (N i d) = Suc(max (pr1 i) (pr1 d))&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1 jeshorcob,davoremar, domcadgom,carvelcab&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot; (*¿Pudiera ser que esta sea más rápida?*)&lt;br /&gt;
fun abc1 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc1 0 = H&amp;quot;&lt;br /&gt;
 |&amp;quot;abc1 (Suc n) = (let a = abc1 n in N a a)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3&amp;quot; -- &amp;quot;= 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;
-- &amp;quot;javrodviv1&amp;quot;&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 a b) = ((f a = f b) ∧ (es_abc f a ∧ es_abc f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom, carvelcab&amp;quot;&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;
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;
text{*Para entenderme he cambiado de función de tamaño, la demostración&lt;br /&gt;
es análoga pero buscando las simplificaciones de size cuando correspondan&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun nodos::&amp;quot;arbol ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;nodos H = 0&amp;quot;&lt;br /&gt;
|&amp;quot;nodos (N i d) = 1+(nodos i)+(nodos d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;size t= nodos t&amp;quot;&lt;br /&gt;
apply (induct t, auto)done&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
value &amp;quot;size (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;
  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;
&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;
text{*Pedrosrei: Los enunciados y demostraciones que vienen a continuación &lt;br /&gt;
son feos y engorrosos. Yo he optado por demostrarlo todo a través de &lt;br /&gt;
una propiedad extraña a la demostración en principio. Animo encarecidamente&lt;br /&gt;
a que pongáis una demostración más corta y directa. Voy explicando paso&lt;br /&gt;
a paso qué he hecho en cada momento. Hecha esta demostración, el resto&lt;br /&gt;
son triviales por una cadena de resultados. &lt;br /&gt;
 No existe relación de implicación en ningún sentido &lt;br /&gt;
 entre hojas y profundidad, como es obvio y muestran los siguientes&lt;br /&gt;
 contraejemplos: *}&lt;br /&gt;
lemma &amp;quot;(((hojas(t1) = hojas(t2)))--&amp;gt;(profundidad(t1) = profundidad(t2)))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) --&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
lemma &amp;quot;((profundidad(t1) = profundidad(t2)) &amp;lt;-&amp;gt;&lt;br /&gt;
 ((hojas(t1) = hojas(t2))))&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {* Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
t1 = N (N H H) (N H H)&lt;br /&gt;
t2 = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
hojas t1 = 4&lt;br /&gt;
hojas t2 = 3&lt;br /&gt;
&lt;br /&gt;
Ahora pongo una serie de resultados auxiliares que ayudarán en la prueba&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
lemma auxprof:&amp;quot;(es_abc profundidad t)∧(profundidad t = n)==&amp;gt; (t= abc n)&amp;quot;&lt;br /&gt;
apply (induct t arbitrary:n, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma eq_1_iff_exp_0:&amp;quot;Suc 0 = 2 ^ n &amp;lt;-&amp;gt; n=0&amp;quot;  apply (cases n, auto) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhojas:&amp;quot;(t= abc n)==&amp;gt; (es_abc hojas t)&amp;quot;&lt;br /&gt;
apply (induct n arbitrary: t, auto simp add: eq_1_iff_exp_0) done&lt;br /&gt;
&lt;br /&gt;
lemma auxhoja:&amp;quot;(t= abc n)==&amp;gt;((hojas t = 2^n))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Y aquí viene la demostración larga y fea que os animo a mejorar.&lt;br /&gt;
He dejado los pasos exactamente que indica el razonador para que &lt;br /&gt;
veáis qué hace en cada caso:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_hoja:&amp;quot;es_abc profundidad t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc hojas t&amp;quot; using auxhojas by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc hojas t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
       es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
       hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc hojas t1 ==&amp;gt;&lt;br /&gt;
         es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
         hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc hojas t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc hojas t2 ==&amp;gt;&lt;br /&gt;
           hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc hojas t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;hojas t1 = hojas t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;hojas t1 = hojas t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc hojas t1&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t1 = (2::nat)^n&amp;quot; using 2 auxhoja by auto&lt;br /&gt;
               hence 3:&amp;quot;hojas t2 =  (2::nat)^n&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc hojas t2&amp;quot; using auxhojas by auto&lt;br /&gt;
               have &amp;quot;hojas t2 =  (2::nat)^m&amp;quot; using 5 auxhoja by auto&lt;br /&gt;
               with 3 have &amp;quot; (2::nat)^m =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; apply (induct, auto)done&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: creo que tengo una demostración mas elegante tan&lt;br /&gt;
sólo hace falta encontrar la relacion entre hojas y profundidad*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma a1: &lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = 2^(pr1 a)&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, carvelcab&amp;quot;&lt;br /&gt;
lemma cpr1_chojas: &amp;quot;es_abc pr1 a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: esta la detallada*)&lt;br /&gt;
--&amp;quot;jeshorcob,caarvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc hojas 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc pr1 (N i d) = &lt;br /&gt;
    (pr1 i = pr1 d ∧ es_abc pr1 i ∧ es_abc pr1 d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (pr1 i = pr1 d ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d &lt;br /&gt;
      ∧ es_abc hojas i ∧ es_abc hojas d)&amp;quot; using a1 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc hojas (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;domcadgom&amp;quot;&lt;br /&gt;
lemma aux1: &amp;quot;(es_abc profundidad a) ⟹ (hojas a) =  (2^(profundidad  a))&amp;quot;&lt;br /&gt;
by (induct a,simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo1: &amp;quot;(es_abc (profundidad) a) = (es_abc (hojas) a)&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
  fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc profundidad a1 = es_abc hojas a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc profundidad a2 = es_abc hojas a2&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc profundidad a2 ∧ es_abc profundidad a1 ⟶ es_abc profundidad &lt;br /&gt;
(N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; using a1 a2 by (simp add: aux1)&lt;br /&gt;
  thus &amp;quot;es_abc profundidad (N a1 a2) = es_abc hojas (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed&lt;br /&gt;
&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;
(* Javrodviv1: Bueno yo para este ejercicio he encontrado algo mas sencillo,&lt;br /&gt;
    tan solo hay que encontrar una relación de igualdad entre hojas y size,&lt;br /&gt;
    que para este caso es sencillo.*)&lt;br /&gt;
-- &amp;quot;Javrodviv1,carvelcab&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma hojasize_igualdad: &lt;br /&gt;
      &amp;quot;hojas x = size x + 1&amp;quot;&lt;br /&gt;
by (induct x, simp_all)&lt;br /&gt;
&lt;br /&gt;
(*lemma &amp;quot;es_abc size a &amp;lt;-&amp;gt; es_abc hojas a&amp;quot; Son equivalentes = es lo mismo que &amp;lt;-&amp;gt; &lt;br /&gt;
    matemáticamente hablando*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot; es_abc size a = es_abc hojas a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
by (induct a, simp_all add: hojasize_igualdad)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text{* Pedrosrei. Aquí dejo esta. Es trivial debido a la demostración anterior,&lt;br /&gt;
sólo hace falta coger el mismo desvío. Aquí sí que podéis encontrar&lt;br /&gt;
una mucho más directa: *}&lt;br /&gt;
&lt;br /&gt;
lemma auxnodo:&amp;quot;(t= abc n)==&amp;gt;(es_abc nodos t)∧(nodos t = (2^n - 1))&amp;quot;&lt;br /&gt;
apply (induct n  arbitrary: t rule: abc.induct, auto)done&lt;br /&gt;
&lt;br /&gt;
lemma nodos_eq_hoja:&amp;quot;es_abc nodos t &amp;lt;-&amp;gt; es_abc hojas t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof -&lt;br /&gt;
have 1:&amp;quot;es_abc hojas t &amp;lt;-&amp;gt; es_abc profundidad t&amp;quot; using prof_eq_hoja by auto&lt;br /&gt;
hence 2:&amp;quot;?P t = (es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot; by auto&lt;br /&gt;
have &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
with 1 2 show ?thesis by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: aquí similar*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma a2: &lt;br /&gt;
  assumes &amp;quot;es_abc size a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
using assms by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma chojas_cnodos: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a, auto simp add: a2)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc hojas a = es_abc size 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 d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc hojas (N i d) = &lt;br /&gt;
    (hojas i = hojas d ∧ es_abc hojas i ∧ es_abc hojas d )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (hojas i = hojas d ∧ es_abc size i ∧ es_abc size d)&amp;quot;&lt;br /&gt;
    using h1 and h2 by simp&lt;br /&gt;
  also have &amp;quot;... = (size i = size d &lt;br /&gt;
      ∧ es_abc size i ∧ es_abc size d)&amp;quot; using a2 by auto&lt;br /&gt;
  also have &amp;quot;... = es_abc size (N i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N i d)&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma aux2: &amp;quot;(es_abc size a) ⟹ ((hojas a) = ((size a) +1))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma completo2: &amp;quot;es_abc hojas a = es_abc (size) a&amp;quot;&lt;br /&gt;
proof (induct a, simp)&lt;br /&gt;
 fix a1 :: arbol and a2 :: arbol&lt;br /&gt;
  assume a1: &amp;quot;es_abc hojas a1 = es_abc size a1&amp;quot;&lt;br /&gt;
  assume a2: &amp;quot;es_abc hojas a2 = es_abc size a2&amp;quot;&lt;br /&gt;
  hence &amp;quot;es_abc size a2 ∧ es_abc size a1 ⟶ &lt;br /&gt;
es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; using a1 by (simp add: aux2)&lt;br /&gt;
  thus &amp;quot;es_abc hojas (N a1 a2) = es_abc size (N a1 a2)&amp;quot; &lt;br /&gt;
using a1 a2 es_abc.simps(2) by blast&lt;br /&gt;
qed &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;
text {* Pedrosrei. De hecho, esta es una parte de la anterior: *}&lt;br /&gt;
&lt;br /&gt;
lemma prof_eq_nodos: &amp;quot;(es_abc profundidad t &amp;lt;-&amp;gt; es_abc nodos t)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
assume a1:&amp;quot;es_abc profundidad t&amp;quot;&lt;br /&gt;
have &amp;quot;∀t. ∃n. n = profundidad t&amp;quot; by auto&lt;br /&gt;
then obtain n where &amp;quot;n = profundidad t&amp;quot; by auto&lt;br /&gt;
with a1 have 1:&amp;quot;t= abc n&amp;quot; using auxprof by auto&lt;br /&gt;
thus &amp;quot;es_abc nodos t&amp;quot; using auxnodo by auto&lt;br /&gt;
next&lt;br /&gt;
show &amp;quot;es_abc nodos t ==&amp;gt; es_abc profundidad t&amp;quot; apply (induct t, auto)&lt;br /&gt;
  proof -&lt;br /&gt;
  fix t1 t2 &lt;br /&gt;
  assume a1:&amp;quot;es_abc profundidad t1&amp;quot;&lt;br /&gt;
  thus &amp;quot;es_abc profundidad t2 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
       es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
       nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
       profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
         assume a2:&amp;quot;es_abc profundidad t2&amp;quot;&lt;br /&gt;
         thus &amp;quot;es_abc nodos t1 ==&amp;gt;&lt;br /&gt;
         es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
         nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
         profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
           assume a3:&amp;quot;es_abc nodos t1&amp;quot;&lt;br /&gt;
           thus &amp;quot;es_abc nodos t2 ==&amp;gt;&lt;br /&gt;
           nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
           profundidad t1 = profundidad t2&amp;quot;proof-&lt;br /&gt;
             assume a4:&amp;quot;es_abc nodos t2&amp;quot;&lt;br /&gt;
             thus &amp;quot;nodos t1 = nodos t2 ==&amp;gt;&lt;br /&gt;
             profundidad t1 = profundidad t2&amp;quot; proof -&lt;br /&gt;
               assume a5:&amp;quot;nodos t1 = nodos t2&amp;quot;&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot;&lt;br /&gt;
               proof-&lt;br /&gt;
               obtain n where 1:&amp;quot;profundidad t1 = n&amp;quot; by auto&lt;br /&gt;
               with a1 have 2:&amp;quot;t1 = abc n&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 3:&amp;quot;es_abc nodos t1&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t1 = (2::nat)^n - 1&amp;quot; using 2 auxnodo by auto&lt;br /&gt;
               hence 3:&amp;quot;nodos t2 =  (2::nat)^n - 1&amp;quot; using a5 by auto&lt;br /&gt;
               obtain m where 4:&amp;quot;profundidad t2 = m&amp;quot; by auto&lt;br /&gt;
               with a2 have 5:&amp;quot;t2 = abc m&amp;quot;using auxprof by auto&lt;br /&gt;
               hence 6:&amp;quot;es_abc nodos t2&amp;quot; using auxnodo by auto&lt;br /&gt;
               have &amp;quot;nodos t2 =  (2::nat)^m - 1&amp;quot; using 5 auxnodo by auto&lt;br /&gt;
               with 3 have 7:&amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot; by auto&lt;br /&gt;
               hence &amp;quot;m = n&amp;quot; proof -&lt;br /&gt;
                 have &amp;quot; (2::nat)^m - 1 =  (2::nat) ^n - 1&amp;quot;using 7 by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m - 1 + 1 =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 hence &amp;quot;(2::nat)^m  =  (2::nat) ^n&amp;quot; by auto&lt;br /&gt;
                 thus ?thesis apply (induct, auto)done&lt;br /&gt;
                 qed&lt;br /&gt;
               hence &amp;quot;t2 = abc n&amp;quot; using 5 by auto&lt;br /&gt;
               with 2 have &amp;quot;t1= t2&amp;quot; by auto&lt;br /&gt;
               thus &amp;quot;profundidad t1 = profundidad t2&amp;quot; by auto&lt;br /&gt;
               qed&lt;br /&gt;
             qed&lt;br /&gt;
           qed&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: sale directo como corolario de los anteriores*)&lt;br /&gt;
--&amp;quot;jeshorcob,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a = es_abc size a&amp;quot;&lt;br /&gt;
using cpr1_chojas and chojas_cnodos by simp_all&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary completo3: &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
 using completo1 completo2 by simp&lt;br /&gt;
&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot; es_abc f (abc n)&amp;quot;&lt;br /&gt;
apply (induct n, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, domcadgom,carvelcab&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &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 n assume h: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;es_abc f (abc (Suc n)) = es_abc f (N (abc n) (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (f (abc n) = f (abc n) ∧ &lt;br /&gt;
    es_abc f (abc n) ∧ es_abc f (abc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using h by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; 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 (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ==&amp;gt; (a= abc (profundidad a))&amp;quot;&lt;br /&gt;
apply (induct a, auto) done&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc pr1 a ⟹ (a = abc (pr1 a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟹ (a = abc (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&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;
--&amp;quot;Pedrosrei:&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc nodos&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
text {*&lt;br /&gt;
El contraejemplo no es más que una medida constante, la trivial:&lt;br /&gt;
&lt;br /&gt;
Quickchecking... &lt;br /&gt;
Testing conjecture with Quickcheck-exhaustive... &lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇣1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc R8_Arboles_binarios_completos.size x = False&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: usando size en lugar de nodos, se encuentra el&lt;br /&gt;
mismo contraejemplo*)&lt;br /&gt;
--&amp;quot;jeshorcob, domcadgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f = es_abc size&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(*&lt;br /&gt;
el contraejemplo es:&lt;br /&gt;
&lt;br /&gt;
f = λx. a⇩1&lt;br /&gt;
x = N H (N H H)&lt;br /&gt;
&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
es_abc f x = True&lt;br /&gt;
es_abc size x = False&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;es_abc f t = es_abc size t&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=200</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=200"/>
		<updated>2014-12-03T10:00:42Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1#(preOrden (espejo a3) @ preOrden (espejo a2))&amp;quot;&lt;br /&gt;
      by simp &lt;br /&gt;
  also have &amp;quot;... = a1#(rev (postOrden a3) @ rev(postOrden a2))&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (postOrden a2) @ (postOrden a3) @[a1] )&amp;quot; &lt;br /&gt;
       by simp &lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N a1 a2 a3)) = postOrden (N a1 (espejo a3) &lt;br /&gt;
      (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden (espejo a3) @  postOrden (espejo a2) @ [a1]&amp;quot; &lt;br /&gt;
       by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden a3) @ rev (preOrden a2) @ [a1]&amp;quot; &lt;br /&gt;
       using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(a1#(preOrden a2)@(preOrden a3))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden (N a1 a2 a3))&amp;quot; by simp  &lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&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 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N a1 a2 a3)) = inOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden (espejo a3) @ [a1] @ inOrden (espejo a2)&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a3) @ [a1] @ rev (inOrden a2)&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a2 @ [a1] @ inOrden a3)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun raiz2 :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
   &amp;quot;raiz2 (H x) = x&amp;quot;&lt;br /&gt;
|  &amp;quot;raiz2 (N x yy zz) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*juacorvic: A partir de aquí en mis definiciones cambio variables por _ .&lt;br /&gt;
Pero, ¿Existe alguna diferencia si usamos variables en vez de _?, ¿Es &lt;br /&gt;
solo por ahorrarnos escribir?&lt;br /&gt;
*)&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* En mi demostración no uso patrones y no consigo demostrar *)&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot;last (inOrden (H a)) = extremo_derecha (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2 a3::&amp;quot;&amp;#039;a arbol&amp;quot; &lt;br /&gt;
  assume  h1: &amp;quot;last (inOrden a2) = extremo_derecha a2&amp;quot;&lt;br /&gt;
  assume  h2: &amp;quot;last (inOrden a3) = extremo_derecha a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N a1 a2 a3)) = last(inOrden a2 @[a1]@ inOrden a3)&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
  then have &amp;quot;... = last (inOrden a3)&amp;quot; by (simp add: a1)&lt;br /&gt;
  then have &amp;quot;... = extremo_derecha a3&amp;quot; using h2 by simp&lt;br /&gt;
  thus &amp;quot;last (inOrden(N a1 a2 a3))=extremo_derecha(N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Sin patrones, pero esta si funciona. ¿Porque no la del ejercicio 12?*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (inOrden (H a)) = extremo_izquierda (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;hd(inOrden a2) = extremo_izquierda a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;hd (inOrden a3) = extremo_izquierda a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N a1 a2 a3)) = hd (inOrden a2 @[a1]@ inOrden a3)&amp;quot;&lt;br /&gt;
     by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden a2)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda a2&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot; hd (inOrden (N a1 a2 a3)) = &lt;br /&gt;
     extremo_izquierda (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* Muy detallada *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
 fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 show &amp;quot;hd (preOrden (H a)) = last (postOrden (H a))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
 fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
 assume h1: &amp;quot;hd (preOrden a2) = last (postOrden a2)&amp;quot; &lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
 assume h2: &amp;quot; hd (preOrden a3) = last (postOrden a3)&amp;quot; &lt;br /&gt;
 have &amp;quot;hd(preOrden (N a1 a2 a3))= hd(a1#(preOrden a2 @ preOrden a3))&amp;quot;&lt;br /&gt;
   by simp&lt;br /&gt;
 also have &amp;quot;... = hd [a1]&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last(postOrden a2 @  postOrden a3 @ [a1])&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
 finally show &amp;quot;hd (preOrden (N a1 a2 a3)) = &lt;br /&gt;
    last (postOrden (N a1 a2 a3))&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 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* Muy detallada *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (preOrden (H a)) = raiz (H a)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
  assume h1: &amp;quot;hd (preOrden a2) = raiz a2&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
  assume h2: &amp;quot; hd (preOrden a3) = raiz a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden (N a1 a2 a3)) = hd(a1#(preOrden a2 @ preOrden a3))&amp;quot;&lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = raiz (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;hd (preOrden (N a1 a2 a3)) = raiz (N a1 a2 a3)&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*Muy detallada*)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; last (postOrden (H a)) = raiz (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
  assume h1:&amp;quot;last (postOrden a2) = raiz a2&amp;quot;&lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
  assume h2:&amp;quot;last (postOrden a3) = raiz a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (postOrden (N a1 a2 a3)) =&lt;br /&gt;
    last(postOrden a2 @  postOrden a3 @ [a1])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = raiz (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
  thus &amp;quot;last (postOrden (N a1 a2 a3)) = raiz (N a1 a2 a3)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=199</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=199"/>
		<updated>2014-12-03T09:58:54Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1#(preOrden (espejo a3) @ preOrden (espejo a2))&amp;quot;&lt;br /&gt;
      by simp &lt;br /&gt;
  also have &amp;quot;... = a1#(rev (postOrden a3) @ rev(postOrden a2))&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (postOrden a2) @ (postOrden a3) @[a1] )&amp;quot; &lt;br /&gt;
       by simp &lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N a1 a2 a3)) = postOrden (N a1 (espejo a3) &lt;br /&gt;
      (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden (espejo a3) @  postOrden (espejo a2) @ [a1]&amp;quot; &lt;br /&gt;
       by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden a3) @ rev (preOrden a2) @ [a1]&amp;quot; &lt;br /&gt;
       using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(a1#(preOrden a2)@(preOrden a3))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden (N a1 a2 a3))&amp;quot; by simp  &lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&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 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N a1 a2 a3)) = inOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden (espejo a3) @ [a1] @ inOrden (espejo a2)&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a3) @ [a1] @ rev (inOrden a2)&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a2 @ [a1] @ inOrden a3)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
fun raiz2 :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
   &amp;quot;raiz2 (H x) = x&amp;quot;&lt;br /&gt;
|  &amp;quot;raiz2 (N x yy zz) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*juacorvic: A partir de aquí en mis definiciones cambio variables por _ .&lt;br /&gt;
Pero, ¿Existe alguna diferencia si usamos variables en vez de _?, ¿Es &lt;br /&gt;
solo por ahorrarnos escribir?&lt;br /&gt;
*)&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic:(En mi demostración no uso patrones y no consigo demostrar)&amp;quot; &lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot;last (inOrden (H a)) = extremo_derecha (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2 a3::&amp;quot;&amp;#039;a arbol&amp;quot; &lt;br /&gt;
  assume  h1: &amp;quot;last (inOrden a2) = extremo_derecha a2&amp;quot;&lt;br /&gt;
  assume  h2: &amp;quot;last (inOrden a3) = extremo_derecha a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N a1 a2 a3)) = last(inOrden a2 @[a1]@ inOrden a3)&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
  then have &amp;quot;... = last (inOrden a3)&amp;quot; by (simp add: a1)&lt;br /&gt;
  then have &amp;quot;... = extremo_derecha a3&amp;quot; using h2 by simp&lt;br /&gt;
  thus &amp;quot;last (inOrden(N a1 a2 a3))=extremo_derecha(N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Sin patrones, pero esta si funciona. ¿Porque no la del ejercicio 12?*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (inOrden (H a)) = extremo_izquierda (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;hd(inOrden a2) = extremo_izquierda a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;hd (inOrden a3) = extremo_izquierda a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N a1 a2 a3)) = hd (inOrden a2 @[a1]@ inOrden a3)&amp;quot;&lt;br /&gt;
     by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden a2)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda a2&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot; hd (inOrden (N a1 a2 a3)) = &lt;br /&gt;
     extremo_izquierda (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* Muy detallada *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
 fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 show &amp;quot;hd (preOrden (H a)) = last (postOrden (H a))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
 fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
 assume h1: &amp;quot;hd (preOrden a2) = last (postOrden a2)&amp;quot; &lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
 assume h2: &amp;quot; hd (preOrden a3) = last (postOrden a3)&amp;quot; &lt;br /&gt;
 have &amp;quot;hd(preOrden (N a1 a2 a3))= hd(a1#(preOrden a2 @ preOrden a3))&amp;quot;&lt;br /&gt;
   by simp&lt;br /&gt;
 also have &amp;quot;... = hd [a1]&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last(postOrden a2 @  postOrden a3 @ [a1])&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
 finally show &amp;quot;hd (preOrden (N a1 a2 a3)) = &lt;br /&gt;
    last (postOrden (N a1 a2 a3))&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 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* Muy detallada *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (preOrden (H a)) = raiz (H a)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
  assume h1: &amp;quot;hd (preOrden a2) = raiz a2&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
  assume h2: &amp;quot; hd (preOrden a3) = raiz a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden (N a1 a2 a3)) = hd(a1#(preOrden a2 @ preOrden a3))&amp;quot;&lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = raiz (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;hd (preOrden (N a1 a2 a3)) = raiz (N a1 a2 a3)&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*Muy detallada*)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; last (postOrden (H a)) = raiz (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
  assume h1:&amp;quot;last (postOrden a2) = raiz a2&amp;quot;&lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
  assume h2:&amp;quot;last (postOrden a3) = raiz a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (postOrden (N a1 a2 a3)) =&lt;br /&gt;
    last(postOrden a2 @  postOrden a3 @ [a1])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = raiz (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
  thus &amp;quot;last (postOrden (N a1 a2 a3)) = raiz (N a1 a2 a3)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=198</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=198"/>
		<updated>2014-12-03T09:57:38Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1#(preOrden (espejo a3) @ preOrden (espejo a2))&amp;quot;&lt;br /&gt;
      by simp &lt;br /&gt;
  also have &amp;quot;... = a1#(rev (postOrden a3) @ rev(postOrden a2))&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (postOrden a2) @ (postOrden a3) @[a1] )&amp;quot; &lt;br /&gt;
       by simp &lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N a1 a2 a3)) = postOrden (N a1 (espejo a3) &lt;br /&gt;
      (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden (espejo a3) @  postOrden (espejo a2) @ [a1]&amp;quot; &lt;br /&gt;
       by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden a3) @ rev (preOrden a2) @ [a1]&amp;quot; &lt;br /&gt;
       using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(a1#(preOrden a2)@(preOrden a3))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden (N a1 a2 a3))&amp;quot; by simp  &lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&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 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N a1 a2 a3)) = inOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden (espejo a3) @ [a1] @ inOrden (espejo a2)&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a3) @ [a1] @ rev (inOrden a2)&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a2 @ [a1] @ inOrden a3)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&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 yy zz) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*juacorvic: A partir de aquí en mis definiciones cambio variables por _ .&lt;br /&gt;
Pero, ¿Existe alguna diferencia si usamos variables en vez de _?, ¿Es &lt;br /&gt;
solo por ahorrarnos escribir?&lt;br /&gt;
*)&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic:(En mi demostración no uso patrones y no consigo demostrar)&amp;quot; &lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot;last (inOrden (H a)) = extremo_derecha (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2 a3::&amp;quot;&amp;#039;a arbol&amp;quot; &lt;br /&gt;
  assume  h1: &amp;quot;last (inOrden a2) = extremo_derecha a2&amp;quot;&lt;br /&gt;
  assume  h2: &amp;quot;last (inOrden a3) = extremo_derecha a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N a1 a2 a3)) = last(inOrden a2 @[a1]@ inOrden a3)&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
  then have &amp;quot;... = last (inOrden a3)&amp;quot; by (simp add: a1)&lt;br /&gt;
  then have &amp;quot;... = extremo_derecha a3&amp;quot; using h2 by simp&lt;br /&gt;
  thus &amp;quot;last (inOrden(N a1 a2 a3))=extremo_derecha(N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Sin patrones, pero esta si funciona. ¿Porque no la del ejercicio 12?*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (inOrden (H a)) = extremo_izquierda (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;hd(inOrden a2) = extremo_izquierda a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;hd (inOrden a3) = extremo_izquierda a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N a1 a2 a3)) = hd (inOrden a2 @[a1]@ inOrden a3)&amp;quot;&lt;br /&gt;
     by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden a2)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda a2&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot; hd (inOrden (N a1 a2 a3)) = &lt;br /&gt;
     extremo_izquierda (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* Muy detallada *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
 fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 show &amp;quot;hd (preOrden (H a)) = last (postOrden (H a))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
 fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
 assume h1: &amp;quot;hd (preOrden a2) = last (postOrden a2)&amp;quot; &lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
 assume h2: &amp;quot; hd (preOrden a3) = last (postOrden a3)&amp;quot; &lt;br /&gt;
 have &amp;quot;hd(preOrden (N a1 a2 a3))= hd(a1#(preOrden a2 @ preOrden a3))&amp;quot;&lt;br /&gt;
   by simp&lt;br /&gt;
 also have &amp;quot;... = hd [a1]&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last(postOrden a2 @  postOrden a3 @ [a1])&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
 finally show &amp;quot;hd (preOrden (N a1 a2 a3)) = &lt;br /&gt;
    last (postOrden (N a1 a2 a3))&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 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* Muy detallada *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (preOrden (H a)) = raiz (H a)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
  assume h1: &amp;quot;hd (preOrden a2) = raiz a2&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
  assume h2: &amp;quot; hd (preOrden a3) = raiz a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden (N a1 a2 a3)) = hd(a1#(preOrden a2 @ preOrden a3))&amp;quot;&lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = raiz (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;hd (preOrden (N a1 a2 a3)) = raiz (N a1 a2 a3)&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*Muy detallada*)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; last (postOrden (H a)) = raiz (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
  assume h1:&amp;quot;last (postOrden a2) = raiz a2&amp;quot;&lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
  assume h2:&amp;quot;last (postOrden a3) = raiz a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (postOrden (N a1 a2 a3)) =&lt;br /&gt;
    last(postOrden a2 @  postOrden a3 @ [a1])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = raiz (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
  thus &amp;quot;last (postOrden (N a1 a2 a3)) = raiz (N a1 a2 a3)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=197</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=197"/>
		<updated>2014-12-03T09:56:08Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1#(preOrden (espejo a3) @ preOrden (espejo a2))&amp;quot;&lt;br /&gt;
      by simp &lt;br /&gt;
  also have &amp;quot;... = a1#(rev (postOrden a3) @ rev(postOrden a2))&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (postOrden a2) @ (postOrden a3) @[a1] )&amp;quot; &lt;br /&gt;
       by simp &lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N a1 a2 a3)) = postOrden (N a1 (espejo a3) &lt;br /&gt;
      (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden (espejo a3) @  postOrden (espejo a2) @ [a1]&amp;quot; &lt;br /&gt;
       by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden a3) @ rev (preOrden a2) @ [a1]&amp;quot; &lt;br /&gt;
       using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(a1#(preOrden a2)@(preOrden a3))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden (N a1 a2 a3))&amp;quot; by simp  &lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&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 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N a1 a2 a3)) = inOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden (espejo a3) @ [a1] @ inOrden (espejo a2)&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a3) @ [a1] @ rev (inOrden a2)&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a2 @ [a1] @ inOrden a3)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&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 yy zz) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*juacorvic: A partir de aquí en mis definiciones cambio variables por _ .&lt;br /&gt;
Pero, ¿Existe alguna diferencia si usamos variables en vez de _?, ¿Es &lt;br /&gt;
solo por ahorrarnos escribir?&lt;br /&gt;
*)&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic:(En mi demostración no uso patrones y no consigo demostrar)&amp;quot; &lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot;last (inOrden (H a)) = extremo_derecha (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2 a3::&amp;quot;&amp;#039;a arbol&amp;quot; &lt;br /&gt;
  assume  h1: &amp;quot;last (inOrden a2) = extremo_derecha a2&amp;quot;&lt;br /&gt;
  assume  h2: &amp;quot;last (inOrden a3) = extremo_derecha a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N a1 a2 a3)) = last(inOrden a2 @[a1]@ inOrden a3)&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
  then have &amp;quot;... = last (inOrden a3)&amp;quot; by (simp add: a1)&lt;br /&gt;
  then have &amp;quot;... = extremo_derecha a3&amp;quot; using h2 by simp&lt;br /&gt;
  thus &amp;quot;last (inOrden(N a1 a2 a3))=extremo_derecha(N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qde&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Sin patrones, pero esta si funciona. ¿Porque no la del ejercicio 12?*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (inOrden (H a)) = extremo_izquierda (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;hd(inOrden a2) = extremo_izquierda a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;hd (inOrden a3) = extremo_izquierda a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N a1 a2 a3)) = hd (inOrden a2 @[a1]@ inOrden a3)&amp;quot;&lt;br /&gt;
     by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden a2)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda a2&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot; hd (inOrden (N a1 a2 a3)) = &lt;br /&gt;
     extremo_izquierda (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* Muy detallada *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
 fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 show &amp;quot;hd (preOrden (H a)) = last (postOrden (H a))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
 fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
 assume h1: &amp;quot;hd (preOrden a2) = last (postOrden a2)&amp;quot; &lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
 assume h2: &amp;quot; hd (preOrden a3) = last (postOrden a3)&amp;quot; &lt;br /&gt;
 have &amp;quot;hd(preOrden (N a1 a2 a3))= hd(a1#(preOrden a2 @ preOrden a3))&amp;quot;&lt;br /&gt;
   by simp&lt;br /&gt;
 also have &amp;quot;... = hd [a1]&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last(postOrden a2 @  postOrden a3 @ [a1])&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
 finally show &amp;quot;hd (preOrden (N a1 a2 a3)) = &lt;br /&gt;
    last (postOrden (N a1 a2 a3))&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 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* Muy detallada *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (preOrden (H a)) = raiz (H a)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
  assume h1: &amp;quot;hd (preOrden a2) = raiz a2&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
  assume h2: &amp;quot; hd (preOrden a3) = raiz a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden (N a1 a2 a3)) = hd(a1#(preOrden a2 @ preOrden a3))&amp;quot;&lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = raiz (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;hd (preOrden (N a1 a2 a3)) = raiz (N a1 a2 a3)&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*Muy detallada*)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; last (postOrden (H a)) = raiz (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
  assume h1:&amp;quot;last (postOrden a2) = raiz a2&amp;quot;&lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
  assume h2:&amp;quot;last (postOrden a3) = raiz a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (postOrden (N a1 a2 a3)) =&lt;br /&gt;
    last(postOrden a2 @  postOrden a3 @ [a1])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = raiz (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
  thus &amp;quot;last (postOrden (N a1 a2 a3)) = raiz (N a1 a2 a3)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=196</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=196"/>
		<updated>2014-12-03T09:49:41Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1#(preOrden (espejo a3) @ preOrden (espejo a2))&amp;quot;&lt;br /&gt;
      by simp &lt;br /&gt;
  also have &amp;quot;... = a1#(rev (postOrden a3) @ rev(postOrden a2))&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (postOrden a2) @ (postOrden a3) @[a1] )&amp;quot; &lt;br /&gt;
       by simp &lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N a1 a2 a3)) = postOrden (N a1 (espejo a3) &lt;br /&gt;
      (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden (espejo a3) @  postOrden (espejo a2) @ [a1]&amp;quot; &lt;br /&gt;
       by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden a3) @ rev (preOrden a2) @ [a1]&amp;quot; &lt;br /&gt;
       using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(a1#(preOrden a2)@(preOrden a3))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden (N a1 a2 a3))&amp;quot; by simp  &lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&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 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N a1 a2 a3)) = inOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden (espejo a3) @ [a1] @ inOrden (espejo a2)&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a3) @ [a1] @ rev (inOrden a2)&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a2 @ [a1] @ inOrden a3)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&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 yy zz) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*juacorvic: A partir de aquí en mis definiciones cambio variables por _ .&lt;br /&gt;
Pero, ¿Existe alguna diferencia si usamos variables en vez de _?, ¿Es &lt;br /&gt;
solo por ahorrarnos escribir?&lt;br /&gt;
*)&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic:(En mi demostración no uso patrones y no consigo demostrar)&amp;quot; &lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot;last (inOrden (H a)) = extremo_derecha (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2 a3::&amp;quot;&amp;#039;a arbol&amp;quot; &lt;br /&gt;
  assume  h1: &amp;quot;last (inOrden a2) = extremo_derecha a2&amp;quot;&lt;br /&gt;
  assume  h2: &amp;quot;last (inOrden a3) = extremo_derecha a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N a1 a2 a3)) = last(inOrden a2 @[a1]@ inOrden a3)&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
  then have &amp;quot;... = last (inOrden a3)&amp;quot; by (simp add: a1)&lt;br /&gt;
  then have &amp;quot;... = extremo_derecha a3&amp;quot; using h2 by simp&lt;br /&gt;
  thus &amp;quot;last (inOrden(N a1 a2 a3))=extremo_derecha(N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qde&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Sin patrones, pero esta si funciona. ¿Porque no la del ejercicio 12?*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (inOrden (H a)) = extremo_izquierda (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;hd(inOrden a2) = extremo_izquierda a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;hd (inOrden a3) = extremo_izquierda a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N a1 a2 a3)) = hd (inOrden a2 @[a1]@ inOrden a3)&amp;quot;&lt;br /&gt;
     by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden a2)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda a2&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot; hd (inOrden (N a1 a2 a3)) = &lt;br /&gt;
     extremo_izquierda (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* Muy detallada *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
 fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 show &amp;quot;hd (preOrden (H a)) = last (postOrden (H a))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
 fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
 assume h1: &amp;quot;hd (preOrden a2) = last (postOrden a2)&amp;quot; &lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
 assume h2: &amp;quot; hd (preOrden a3) = last (postOrden a3)&amp;quot; &lt;br /&gt;
 have &amp;quot;hd(preOrden (N a1 a2 a3))= hd(a1#(preOrden a2 @ preOrden a3))&amp;quot;&lt;br /&gt;
   by simp&lt;br /&gt;
 also have &amp;quot;... = hd [a1]&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last(postOrden a2 @  postOrden a3 @ [a1])&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
 finally show &amp;quot;hd (preOrden (N a1 a2 a3)) = &lt;br /&gt;
    last (postOrden (N a1 a2 a3))&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 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* Muy detallada *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (preOrden (H a)) = raiz (H a)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
  assume h1: &amp;quot;hd (preOrden a2) = raiz a2&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
  assume h2: &amp;quot; hd (preOrden a3) = raiz a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden (N a1 a2 a3)) = hd(a1#(preOrden a2 @ preOrden a3))&amp;quot;&lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = raiz (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;hd (preOrden (N a1 a2 a3)) = raiz (N a1 a2 a3)&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=195</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=195"/>
		<updated>2014-12-03T09:49:00Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1#(preOrden (espejo a3) @ preOrden (espejo a2))&amp;quot;&lt;br /&gt;
      by simp &lt;br /&gt;
  also have &amp;quot;... = a1#(rev (postOrden a3) @ rev(postOrden a2))&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (postOrden a2) @ (postOrden a3) @[a1] )&amp;quot; &lt;br /&gt;
       by simp &lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N a1 a2 a3)) = postOrden (N a1 (espejo a3) &lt;br /&gt;
      (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden (espejo a3) @  postOrden (espejo a2) @ [a1]&amp;quot; &lt;br /&gt;
       by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden a3) @ rev (preOrden a2) @ [a1]&amp;quot; &lt;br /&gt;
       using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(a1#(preOrden a2)@(preOrden a3))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden (N a1 a2 a3))&amp;quot; by simp  &lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&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 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N a1 a2 a3)) = inOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden (espejo a3) @ [a1] @ inOrden (espejo a2)&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a3) @ [a1] @ rev (inOrden a2)&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a2 @ [a1] @ inOrden a3)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&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 yy zz) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*juacorvic: A partir de aquí en mis definiciones cambio variables por _ .&lt;br /&gt;
Pero, ¿Existe alguna diferencia si usamos variables en vez de _?, ¿Es &lt;br /&gt;
solo por ahorrarnos escribir?&lt;br /&gt;
*)&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic:(En mi demostración no uso patrones y no consigo demostrar)&amp;quot; &lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot;last (inOrden (H a)) = extremo_derecha (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2 a3::&amp;quot;&amp;#039;a arbol&amp;quot; &lt;br /&gt;
  assume  h1: &amp;quot;last (inOrden a2) = extremo_derecha a2&amp;quot;&lt;br /&gt;
  assume  h2: &amp;quot;last (inOrden a3) = extremo_derecha a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N a1 a2 a3)) = last(inOrden a2 @[a1]@ inOrden a3)&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
  then have &amp;quot;... = last (inOrden a3)&amp;quot; by (simp add: a1)&lt;br /&gt;
  then have &amp;quot;... = extremo_derecha a3&amp;quot; using h2 by simp&lt;br /&gt;
  thus &amp;quot;last (inOrden(N a1 a2 a3))=extremo_derecha(N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qde&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Sin patrones, pero esta si funciona. ¿Porque no la del ejercicio 12?*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (inOrden (H a)) = extremo_izquierda (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;hd(inOrden a2) = extremo_izquierda a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;hd (inOrden a3) = extremo_izquierda a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N a1 a2 a3)) = hd (inOrden a2 @[a1]@ inOrden a3)&amp;quot;&lt;br /&gt;
     by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden a2)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda a2&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot; hd (inOrden (N a1 a2 a3)) = &lt;br /&gt;
     extremo_izquierda (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* Muy detallada *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
 fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 show &amp;quot;hd (preOrden (H a)) = last (postOrden (H a))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
 fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
 assume h1: &amp;quot;hd (preOrden a2) = last (postOrden a2)&amp;quot; &lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
 assume h2: &amp;quot; hd (preOrden a3) = last (postOrden a3)&amp;quot; &lt;br /&gt;
 have &amp;quot;hd(preOrden (N a1 a2 a3))= hd(a1#(preOrden a2 @ preOrden a3))&amp;quot;&lt;br /&gt;
   by simp&lt;br /&gt;
 also have &amp;quot;... = hd [a1]&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last(postOrden a2 @  postOrden a3 @ [a1])&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
 finally show &amp;quot;hd (preOrden (N a1 a2 a3)) = &lt;br /&gt;
    last (postOrden (N a1 a2 a3))&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 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* Muy detallada *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (preOrden (H a)) = raiz (H a)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
  assume h1: &amp;quot;hd (preOrden a2) = raiz a2&amp;quot;&lt;br /&gt;
  (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
  assume h2: &amp;quot; hd (preOrden a3) = raiz a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden (N a1 a2 a3)) = hd(a1#(preOrden a2 @ preOrden a3))&amp;quot;&lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = raiz (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;hd (preOrden (N a1 a2 a3)) = raiz (N a1 a2 a3)&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=194</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=194"/>
		<updated>2014-12-03T09:41:37Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1#(preOrden (espejo a3) @ preOrden (espejo a2))&amp;quot;&lt;br /&gt;
      by simp &lt;br /&gt;
  also have &amp;quot;... = a1#(rev (postOrden a3) @ rev(postOrden a2))&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (postOrden a2) @ (postOrden a3) @[a1] )&amp;quot; &lt;br /&gt;
       by simp &lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N a1 a2 a3)) = postOrden (N a1 (espejo a3) &lt;br /&gt;
      (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden (espejo a3) @  postOrden (espejo a2) @ [a1]&amp;quot; &lt;br /&gt;
       by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden a3) @ rev (preOrden a2) @ [a1]&amp;quot; &lt;br /&gt;
       using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(a1#(preOrden a2)@(preOrden a3))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden (N a1 a2 a3))&amp;quot; by simp  &lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&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 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N a1 a2 a3)) = inOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden (espejo a3) @ [a1] @ inOrden (espejo a2)&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a3) @ [a1] @ rev (inOrden a2)&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a2 @ [a1] @ inOrden a3)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&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 yy zz) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*juacorvic: A partir de aquí en mis definiciones cambio variables por _ .&lt;br /&gt;
Pero, ¿Existe alguna diferencia si usamos variables en vez de _?, ¿Es &lt;br /&gt;
solo por ahorrarnos escribir?&lt;br /&gt;
*)&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic:(En mi demostración no uso patrones y no consigo demostrar)&amp;quot; &lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot;last (inOrden (H a)) = extremo_derecha (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2 a3::&amp;quot;&amp;#039;a arbol&amp;quot; &lt;br /&gt;
  assume  h1: &amp;quot;last (inOrden a2) = extremo_derecha a2&amp;quot;&lt;br /&gt;
  assume  h2: &amp;quot;last (inOrden a3) = extremo_derecha a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N a1 a2 a3)) = last(inOrden a2 @[a1]@ inOrden a3)&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
  then have &amp;quot;... = last (inOrden a3)&amp;quot; by (simp add: a1)&lt;br /&gt;
  then have &amp;quot;... = extremo_derecha a3&amp;quot; using h2 by simp&lt;br /&gt;
  thus &amp;quot;last (inOrden(N a1 a2 a3))=extremo_derecha(N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qde&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Sin patrones, pero esta si funciona. ¿Porque no la del ejercicio 12?*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (inOrden (H a)) = extremo_izquierda (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;hd(inOrden a2) = extremo_izquierda a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;hd (inOrden a3) = extremo_izquierda a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N a1 a2 a3)) = hd (inOrden a2 @[a1]@ inOrden a3)&amp;quot;&lt;br /&gt;
     by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden a2)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda a2&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot; hd (inOrden (N a1 a2 a3)) = &lt;br /&gt;
     extremo_izquierda (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* Muy detallada *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
 fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 show &amp;quot;hd (preOrden (H a)) = last (postOrden (H a))&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
 fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
 fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h1*)&lt;br /&gt;
 assume h1: &amp;quot;hd (preOrden a2) = last (postOrden a2)&amp;quot; &lt;br /&gt;
 (*La siguiente línea puede eliminarse. No se usa hipótesis h2*)&lt;br /&gt;
 assume h2: &amp;quot; hd (preOrden a3) = last (postOrden a3)&amp;quot; &lt;br /&gt;
 have &amp;quot;hd(preOrden (N a1 a2 a3))= hd(a1#(preOrden a2 @ preOrden a3))&amp;quot;&lt;br /&gt;
   by simp&lt;br /&gt;
 also have &amp;quot;... = hd [a1]&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = a1&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last(postOrden a2 @  postOrden a3 @ [a1])&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;... = last (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
 finally show &amp;quot;hd (preOrden (N a1 a2 a3)) = &lt;br /&gt;
    last (postOrden (N a1 a2 a3))&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 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=193</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=193"/>
		<updated>2014-12-03T09:10:25Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1#(preOrden (espejo a3) @ preOrden (espejo a2))&amp;quot;&lt;br /&gt;
      by simp &lt;br /&gt;
  also have &amp;quot;... = a1#(rev (postOrden a3) @ rev(postOrden a2))&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (postOrden a2) @ (postOrden a3) @[a1] )&amp;quot; &lt;br /&gt;
       by simp &lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N a1 a2 a3)) = postOrden (N a1 (espejo a3) &lt;br /&gt;
      (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden (espejo a3) @  postOrden (espejo a2) @ [a1]&amp;quot; &lt;br /&gt;
       by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden a3) @ rev (preOrden a2) @ [a1]&amp;quot; &lt;br /&gt;
       using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(a1#(preOrden a2)@(preOrden a3))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden (N a1 a2 a3))&amp;quot; by simp  &lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&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 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N a1 a2 a3)) = inOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden (espejo a3) @ [a1] @ inOrden (espejo a2)&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a3) @ [a1] @ rev (inOrden a2)&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a2 @ [a1] @ inOrden a3)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&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 yy zz) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*juacorvic: A partir de aquí en mis definiciones cambio variables por _ .&lt;br /&gt;
Pero, ¿Existe alguna diferencia si usamos variables en vez de _?, ¿Es &lt;br /&gt;
solo por ahorrarnos escribir?&lt;br /&gt;
*)&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic:(En mi demostración no uso patrones y no consigo demostrar)&amp;quot; &lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot;last (inOrden (H a)) = extremo_derecha (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2 a3::&amp;quot;&amp;#039;a arbol&amp;quot; &lt;br /&gt;
  assume  h1: &amp;quot;last (inOrden a2) = extremo_derecha a2&amp;quot;&lt;br /&gt;
  assume  h2: &amp;quot;last (inOrden a3) = extremo_derecha a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N a1 a2 a3)) = last(inOrden a2 @[a1]@ inOrden a3)&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
  then have &amp;quot;... = last (inOrden a3)&amp;quot; by (simp add: a1)&lt;br /&gt;
  then have &amp;quot;... = extremo_derecha a3&amp;quot; using h2 by simp&lt;br /&gt;
  thus &amp;quot;last (inOrden(N a1 a2 a3))=extremo_derecha(N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qde&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Sin patrones, pero esta si funciona. ¿Porque no la del ejercicio 12?*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (inOrden (H a)) = extremo_izquierda (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;hd(inOrden a2) = extremo_izquierda a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;hd (inOrden a3) = extremo_izquierda a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N a1 a2 a3)) = hd (inOrden a2 @[a1]@ inOrden a3)&amp;quot;&lt;br /&gt;
     by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden a2)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda a2&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot; hd (inOrden (N a1 a2 a3)) = &lt;br /&gt;
     extremo_izquierda (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=192</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=192"/>
		<updated>2014-12-03T09:09:08Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1#(preOrden (espejo a3) @ preOrden (espejo a2))&amp;quot;&lt;br /&gt;
      by simp &lt;br /&gt;
  also have &amp;quot;... = a1#(rev (postOrden a3) @ rev(postOrden a2))&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (postOrden a2) @ (postOrden a3) @[a1] )&amp;quot; &lt;br /&gt;
       by simp &lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N a1 a2 a3)) = postOrden (N a1 (espejo a3) &lt;br /&gt;
      (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden (espejo a3) @  postOrden (espejo a2) @ [a1]&amp;quot; &lt;br /&gt;
       by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden a3) @ rev (preOrden a2) @ [a1]&amp;quot; &lt;br /&gt;
       using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(a1#(preOrden a2)@(preOrden a3))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden (N a1 a2 a3))&amp;quot; by simp  &lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&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 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N a1 a2 a3)) = inOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden (espejo a3) @ [a1] @ inOrden (espejo a2)&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a3) @ [a1] @ rev (inOrden a2)&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a2 @ [a1] @ inOrden a3)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&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 yy zz) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*juacorvic: A partir de aquí en mis definiciones cambio variables por _ .&lt;br /&gt;
Pero, ¿Existe alguna diferencia si usamos variables en vez de _?, ¿Es &lt;br /&gt;
solo por ahorrarnos escribir?&lt;br /&gt;
*)&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic:(En mi demostración no uso patrones y no consigo demostrar)&amp;quot; &lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot;last (inOrden (H a)) = extremo_derecha (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2 a3::&amp;quot;&amp;#039;a arbol&amp;quot; &lt;br /&gt;
  assume  h1: &amp;quot;last (inOrden a2) = extremo_derecha a2&amp;quot;&lt;br /&gt;
  assume  h2: &amp;quot;last (inOrden a3) = extremo_derecha a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N a1 a2 a3)) = last(inOrden a2 @[a1]@ inOrden a3)&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
  then have &amp;quot;... = last (inOrden a3)&amp;quot; by (simp add: a1)&lt;br /&gt;
  then have &amp;quot;... = extremo_derecha a3&amp;quot; using h2 by simp&lt;br /&gt;
  thus &amp;quot;last (inOrden(N a1 a2 a3))=extremo_derecha(N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qde&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Sin patrones, pero esta si funciona. ¿Porque no la del ejercicio 12?&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot; hd (inOrden (H a)) = extremo_izquierda (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  fix a3::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;hd(inOrden a2) = extremo_izquierda a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;hd (inOrden a3) = extremo_izquierda a3&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N a1 a2 a3)) = hd (inOrden a2 @[a1]@ inOrden a3)&amp;quot;&lt;br /&gt;
     by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden a2)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda a2&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot; hd (inOrden (N a1 a2 a3)) = &lt;br /&gt;
     extremo_izquierda (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=191</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=191"/>
		<updated>2014-12-03T08:22:30Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1#(preOrden (espejo a3) @ preOrden (espejo a2))&amp;quot;&lt;br /&gt;
      by simp &lt;br /&gt;
  also have &amp;quot;... = a1#(rev (postOrden a3) @ rev(postOrden a2))&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (postOrden a2) @ (postOrden a3) @[a1] )&amp;quot; &lt;br /&gt;
       by simp &lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N a1 a2 a3)) = postOrden (N a1 (espejo a3) &lt;br /&gt;
      (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden (espejo a3) @  postOrden (espejo a2) @ [a1]&amp;quot; &lt;br /&gt;
       by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden a3) @ rev (preOrden a2) @ [a1]&amp;quot; &lt;br /&gt;
       using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(a1#(preOrden a2)@(preOrden a3))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden (N a1 a2 a3))&amp;quot; by simp  &lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&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 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N a1 a2 a3)) = inOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden (espejo a3) @ [a1] @ inOrden (espejo a2)&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a3) @ [a1] @ rev (inOrden a2)&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a2 @ [a1] @ inOrden a3)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&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 yy zz) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*juacorvic: A partir de aquí en mis definiciones cambio variables por _ .&lt;br /&gt;
Pero, ¿Existe alguna diferencia si usamos variables en vez de _?, ¿Es &lt;br /&gt;
solo por ahorrarnos escribir?&lt;br /&gt;
*)&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic:(En mi demostración no uso patrones y no consigo demostrar)&amp;quot; &lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix a::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot;last (inOrden (H a)) = extremo_derecha (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix a2 a3::&amp;quot;&amp;#039;a arbol&amp;quot; &lt;br /&gt;
  assume  h1: &amp;quot;last (inOrden a2) = extremo_derecha a2&amp;quot;&lt;br /&gt;
  assume  h2: &amp;quot;last (inOrden a3) = extremo_derecha a3&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N a1 a2 a3)) = last(inOrden a2 @[a1]@ inOrden a3)&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
  then have &amp;quot;... = last (inOrden a3)&amp;quot; by (simp add: a1)&lt;br /&gt;
  then have &amp;quot;... = extremo_derecha a3&amp;quot; using h2 by simp&lt;br /&gt;
  thus &amp;quot;last (inOrden(N a1 a2 a3))=extremo_derecha(N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qde&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=190</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=190"/>
		<updated>2014-12-02T09:10:59Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1#(preOrden (espejo a3) @ preOrden (espejo a2))&amp;quot;&lt;br /&gt;
      by simp &lt;br /&gt;
  also have &amp;quot;... = a1#(rev (postOrden a3) @ rev(postOrden a2))&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (postOrden a2) @ (postOrden a3) @[a1] )&amp;quot; &lt;br /&gt;
       by simp &lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N a1 a2 a3)) = postOrden (N a1 (espejo a3) &lt;br /&gt;
      (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden (espejo a3) @  postOrden (espejo a2) @ [a1]&amp;quot; &lt;br /&gt;
       by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden a3) @ rev (preOrden a2) @ [a1]&amp;quot; &lt;br /&gt;
       using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(a1#(preOrden a2)@(preOrden a3))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden (N a1 a2 a3))&amp;quot; by simp  &lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&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 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Igual pero un paso más. Se usan variables sugeridas)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N a1 a2 a3)) = inOrden (N a1 (espejo a3) &lt;br /&gt;
     (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden (espejo a3) @ [a1] @ inOrden (espejo a2)&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a3) @ [a1] @ rev (inOrden a2)&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden a2 @ [a1] @ inOrden a3)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = 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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=189</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=189"/>
		<updated>2014-12-02T08:24:18Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic (Similar, al final se da un paso más)&amp;quot; &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 a&lt;br /&gt;
  show &amp;quot;?P (H a)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume h1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) (espejo a2))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a1#(preOrden (espejo a3) @ preOrden (espejo a2))&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = a1#(rev (postOrden a3) @ rev(postOrden a2))&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev( (postOrden a2) @ (postOrden a3) @[a1] )&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N a1 a2 a3))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N a1 a2 a3)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = 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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=188</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=188"/>
		<updated>2014-12-02T07:53:20Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = 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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=187</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_7&amp;diff=187"/>
		<updated>2014-12-02T07:50:45Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R7: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R7&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = x#(preOrden yy @ preOrden zz)&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; -- &amp;quot;True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (N a1 (H a2) (H a3)) (H d)) (N g (H f) (H h))) &lt;br /&gt;
 = [e, c, a1, a2, a3, d, g, f, h]&amp;quot; -- &amp;quot;True&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;
     = [a,d,c,f,h,g,e]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz)= postOrden yy @ postOrden zz @ [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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&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 yy zz) = inOrden yy @ [x] @ inOrden zz&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 yy zz) = (N x (espejo zz) (espejo yy))&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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x yy zz&lt;br /&gt;
  assume h1: &amp;quot;?P yy&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P zz&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x yy zz))&lt;br /&gt;
    = preOrden (N x (espejo zz) (espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#(preOrden(espejo zz)@preOrden(espejo yy))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x#rev(postOrden zz)@rev(postOrden yy)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev((postOrden yy)@(postOrden zz)@[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x yy zz)&amp;quot; by simp&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x y z)) = &lt;br /&gt;
    postOrden (N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden(espejo z)@postOrden(espejo y)@[x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(preOrden z)@rev(preOrden y)@[x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(x#(preOrden y)@(preOrden z))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden(espejo (N x y z)) = &lt;br /&gt;
    inOrden(N x (espejo z) (espejo y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden(espejo z)@[x]@inOrden(espejo y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden z)@[x]@rev(inOrden y)&amp;quot; using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev(inOrden y @ [x] @ inOrden z)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ ) = 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; -- &amp;quot;True&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ yy _) = extremo_izquierda yy&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 _ _ zz) = extremo_derecha zz&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)))&amp;quot; -- &amp;quot;= 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
(*jeshorcob: al intentar hacer la prueba automática, el sistema se &lt;br /&gt;
pregunta por el caso en el que la lista sea vacía. Debemos indicar que&lt;br /&gt;
esto no puede ocurrir y para ello añadimos un lema auxiliar.*)&lt;br /&gt;
lemma a1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma  &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; show &amp;quot;inOrden (H x) ≠ []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume h1: &amp;quot;inOrden y ≠ []&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;inOrden z ≠ []&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (N x y z) ≠ []&amp;quot; using h1 h2 by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h2: &amp;quot;?P z&amp;quot;&lt;br /&gt;
  have &amp;quot;last(inOrden(N x y z))=last(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last(inOrden z)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha z&amp;quot; using h2 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis append_is_Nil_conv arbol.exhaust&lt;br /&gt;
  inOrden.simps(1) inOrden.simps(2) list.distinct(1)) done&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
(*jeshorcob: aquí necesitamos el mismo lema por un motivo similar*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: a1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume h1: &amp;quot;?P y&amp;quot;&lt;br /&gt;
  have &amp;quot;hd(inOrden(N x y z))=hd(inOrden y @[x]@ inOrden z)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd(inOrden y)&amp;quot; by (simp add: a1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda y&amp;quot; using h1 by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;Pedrosrei&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
apply (induct a, simp_all) apply (metis Nil_is_append_conv&lt;br /&gt;
  extremo_izquierda.cases hd_append inOrden.simps(1) inOrden.simps(2)&lt;br /&gt;
  list.distinct(1)) 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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&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 y @ postOrden z @[x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;hd(preOrden(N x y z)) = hd(x#(preOrden y @ preOrden z))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&amp;quot; by simp&lt;br /&gt;
qed&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contrajemplo:&lt;br /&gt;
a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
&lt;br /&gt;
ya que evaluando se ve que son distindos:&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a, simp_all)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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 show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and y z&lt;br /&gt;
  have &amp;quot;last(postOrden(N x y z)) = &lt;br /&gt;
    last(postOrden y @ postOrden z @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x y z)&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>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=172</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=172"/>
		<updated>2014-11-25T08:49:57Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R6: Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
theory R6&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota: En esta relación se pide hacer las demostraciones de forma &lt;br /&gt;
  automática. *} &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::int) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;sust x y (z#zs) = (if z = x then y#(sust x y zs) else z#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sust (1::int) 2 [1,2,3,4,1,2,3,4]&amp;quot; -- &amp;quot;= [2,2,3,4,2,2,3,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma rev_sust: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs, simp_all add: sust_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma rev_sust2: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs) (auto simp add:sust_append)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
u = a⇩2&lt;br /&gt;
v = a⇩1&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
z = a⇩2&lt;br /&gt;
x = a⇩2&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::int) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borra x (y#ys) = (if y=x then ys else y#borra x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borra (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3,2]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::int) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borraTodas x (y#ys) = (if y = x then borraTodas x ys &lt;br /&gt;
                                   else y#borraTodas x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borraTodas (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma l1: &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar &lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma borraTodas_borra: &lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: l1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_borra)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar &lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
by (induct zs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
z = a⇩1&lt;br /&gt;
zs = [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;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma borraTodas_append:&lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=171</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=171"/>
		<updated>2014-11-25T08:46:37Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R6: Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
theory R6&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota: En esta relación se pide hacer las demostraciones de forma &lt;br /&gt;
  automática. *} &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::int) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;sust x y (z#zs) = (if z = x then y#(sust x y zs) else z#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sust (1::int) 2 [1,2,3,4,1,2,3,4]&amp;quot; -- &amp;quot;= [2,2,3,4,2,2,3,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma rev_sust: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs, simp_all add: sust_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma rev_sust2: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs) (auto simp add:sust_append)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
u = a⇩2&lt;br /&gt;
v = a⇩1&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
z = a⇩2&lt;br /&gt;
x = a⇩2&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::int) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borra x (y#ys) = (if y=x then ys else y#borra x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borra (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3,2]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::int) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borraTodas x (y#ys) = (if y = x then borraTodas x ys &lt;br /&gt;
                                   else y#borraTodas x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borraTodas (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma l1: &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar &lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma borraTodas_borra: &lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: l1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_borra)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar &lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
by (induct zs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
z = a⇩1&lt;br /&gt;
zs = [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;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma borraTodas_append:&lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=170</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=170"/>
		<updated>2014-11-25T08:43:08Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R6: Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
theory R6&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota: En esta relación se pide hacer las demostraciones de forma &lt;br /&gt;
  automática. *} &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::int) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;sust x y (z#zs) = (if z = x then y#(sust x y zs) else z#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sust (1::int) 2 [1,2,3,4,1,2,3,4]&amp;quot; -- &amp;quot;= [2,2,3,4,2,2,3,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma rev_sust: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs, simp_all add: sust_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma rev_sust2: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs) (auto simp add:sust_append)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
u = a⇩2&lt;br /&gt;
v = a⇩1&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
z = a⇩2&lt;br /&gt;
x = a⇩2&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::int) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borra x (y#ys) = (if y=x then ys else y#borra x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borra (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3,2]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::int) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borraTodas x (y#ys) = (if y = x then borraTodas x ys &lt;br /&gt;
                                   else y#borraTodas x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borraTodas (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma l1: &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar &lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma borraTodas_borra: &lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: l1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_borra)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar &lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
by (induct zs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
z = a⇩1&lt;br /&gt;
zs = [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;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma borraTodas_append:&lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=169</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=169"/>
		<updated>2014-11-25T08:37:46Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R6: Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
theory R6&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota: En esta relación se pide hacer las demostraciones de forma &lt;br /&gt;
  automática. *} &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::int) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;sust x y (z#zs) = (if z = x then y#(sust x y zs) else z#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sust (1::int) 2 [1,2,3,4,1,2,3,4]&amp;quot; -- &amp;quot;= [2,2,3,4,2,2,3,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma rev_sust: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs, simp_all add: sust_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma rev_sust2: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs) (auto simp add:sust_append)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
u = a⇩2&lt;br /&gt;
v = a⇩1&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
z = a⇩2&lt;br /&gt;
x = a⇩2&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::int) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borra x (y#ys) = (if y=x then ys else y#borra x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borra (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3,2]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::int) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borraTodas x (y#ys) = (if y = x then borraTodas x ys &lt;br /&gt;
                                   else y#borraTodas x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borraTodas (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma l1: &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar &lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma borraTodas_borra: &lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: l1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_borra)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar &lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
by (induct zs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
z = a⇩1&lt;br /&gt;
zs = [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;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma borraTodas_append:&lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=168</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=168"/>
		<updated>2014-11-25T08:27:01Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R6: Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
theory R6&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota: En esta relación se pide hacer las demostraciones de forma &lt;br /&gt;
  automática. *} &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::int) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;sust x y (z#zs) = (if z = x then y#(sust x y zs) else z#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sust (1::int) 2 [1,2,3,4,1,2,3,4]&amp;quot; -- &amp;quot;= [2,2,3,4,2,2,3,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma rev_sust: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs, simp_all add: sust_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma rev_sust2: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs) (auto simp add:sust_append)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
u = a⇩2&lt;br /&gt;
v = a⇩1&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
z = a⇩2&lt;br /&gt;
x = a⇩2&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::int) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borra x (y#ys) = (if y=x then ys else y#borra x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borra (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3,2]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::int) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borraTodas x (y#ys) = (if y = x then borraTodas x ys &lt;br /&gt;
                                   else y#borraTodas x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borraTodas (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma l1: &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar &lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma borraTodas_borra: &lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: l1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_borra)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar &lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
by (induct zs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
z = a⇩1&lt;br /&gt;
zs = [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;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma borraTodas_append:&lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=167</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=167"/>
		<updated>2014-11-24T08:43:54Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R6: Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
theory R6&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota: En esta relación se pide hacer las demostraciones de forma &lt;br /&gt;
  automática. *} &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::int) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;sust x y (z#zs) = (if z = x then y#(sust x y zs) else z#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sust (1::int) 2 [1,2,3,4,1,2,3,4]&amp;quot; -- &amp;quot;= [2,2,3,4,2,2,3,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma rev_sust: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs, simp_all add: sust_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma rev_sust2: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs) (auto simp add:sust_append)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
u = a⇩2&lt;br /&gt;
v = a⇩1&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
z = a⇩2&lt;br /&gt;
x = a⇩2&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::int) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borra x (y#ys) = (if y=x then ys else y#borra x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borra (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3,2]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::int) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borraTodas x (y#ys) = (if y = x then borraTodas x ys &lt;br /&gt;
                                   else y#borraTodas x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borraTodas (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma l1: &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar &lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma borraTodas_borra: &lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: l1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_borra)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar &lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
by (induct zs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
z = a⇩1&lt;br /&gt;
zs = [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;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma borraTodas_append:&lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=166</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=166"/>
		<updated>2014-11-24T08:06:50Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R6: Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
theory R6&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota: En esta relación se pide hacer las demostraciones de forma &lt;br /&gt;
  automática. *} &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::int) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;sust x y (z#zs) = (if z = x then y#(sust x y zs) else z#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sust (1::int) 2 [1,2,3,4,1,2,3,4]&amp;quot; -- &amp;quot;= [2,2,3,4,2,2,3,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma rev_sust: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs, simp_all add: sust_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma rev_sust2: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs) (auto simp add:sust_append)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
u = a⇩2&lt;br /&gt;
v = a⇩1&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
z = a⇩2&lt;br /&gt;
x = a⇩2&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::int) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borra x (y#ys) = (if y=x then ys else y#borra x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borra (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3,2]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::int) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borraTodas x (y#ys) = (if y = x then borraTodas x ys &lt;br /&gt;
                                   else y#borraTodas x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borraTodas (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma l1: &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar &lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma borraTodas_borra: &lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: l1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_borra)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar &lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
by (induct zs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
z = a⇩1&lt;br /&gt;
zs = [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;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma borraTodas_append:&lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=165</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=165"/>
		<updated>2014-11-24T08:01:21Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R6: Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
theory R6&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota: En esta relación se pide hacer las demostraciones de forma &lt;br /&gt;
  automática. *} &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::int) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;sust x y (z#zs) = (if z = x then y#(sust x y zs) else z#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sust (1::int) 2 [1,2,3,4,1,2,3,4]&amp;quot; -- &amp;quot;= [2,2,3,4,2,2,3,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma rev_sust: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs, simp_all add: sust_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma rev_sust2: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs) (auto simp add:sust_append)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
u = a⇩2&lt;br /&gt;
v = a⇩1&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
z = a⇩2&lt;br /&gt;
x = a⇩2&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::int) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borra x (y#ys) = (if y=x then ys else y#borra x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borra (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3,2]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::int) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borraTodas x (y#ys) = (if y = x then borraTodas x ys &lt;br /&gt;
                                   else y#borraTodas x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borraTodas (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma l1: &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar &lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma borraTodas_borra: &lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: l1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_borra)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar &lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
by (induct zs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
z = a⇩1&lt;br /&gt;
zs = [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;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma borraTodas_append:&lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=164</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_6&amp;diff=164"/>
		<updated>2014-11-24T07:53:36Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R6: Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
theory R6&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota: En esta relación se pide hacer las demostraciones de forma &lt;br /&gt;
  automática. *} &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::int) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
fun sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;sust x y (z#zs) = (if z = x then y#(sust x y zs) else z#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sust (1::int) 2 [1,2,3,4,1,2,3,4]&amp;quot; -- &amp;quot;= [2,2,3,4,2,2,3,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv,davoremar,juacorvic&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma rev_sust: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs, simp_all add: sust_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma rev_sust2: &lt;br /&gt;
  &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
by (induct zs) (auto simp add:sust_append)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
u = a⇩2&lt;br /&gt;
v = a⇩1&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
z = a⇩2&lt;br /&gt;
x = a⇩2&lt;br /&gt;
zs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::int) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borra x (y#ys) = (if y=x then ys else y#borra x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borra (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3,2]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::int) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
fun borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;borraTodas x (y#ys) = (if y = x then borraTodas x ys &lt;br /&gt;
                                   else y#borraTodas x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;borraTodas (2::int) [1,2,3,2]&amp;quot; -- &amp;quot;= [1,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma l1: &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar &lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma borraTodas_borra: &lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar automáticamente&lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: l1)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_borra)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
y = a⇩1&lt;br /&gt;
x = a⇩2&lt;br /&gt;
xs = [a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar &lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
by (induct zs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
y = a⇩2&lt;br /&gt;
z = a⇩1&lt;br /&gt;
zs = [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;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Encuentra el contraejemplo:&lt;br /&gt;
x = a⇩1&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma borraTodas_append:&lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs, simp_all add: borraTodas_append)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=152</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=152"/>
		<updated>2014-11-20T14:18:35Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R5: Cuantificadores sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
theory R5&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic,davoremar, marnajgom&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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 xs =  foldr (λx. op ∧ (p x)) xs True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun todos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos3 p [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos3 p (x#xs) = (if p x then (todos3 p xs) else False)&amp;quot;&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;
(* Errata. Debe ser False el caso base seguro porque si no,&lt;br /&gt;
 la función devuelve siempre True*)&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1,juacorvic,davoremar, marnajgom&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun algunos2 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos2 p xs =  foldr (λx. op ∨ (p x)) xs False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;algunos (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
value &amp;quot;algunos2 (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun algunos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos3 p [] = False&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos3 p (x#xs) = (p x ∨ todos p xs)&amp;quot;&lt;br /&gt;
(* Nota. Nos da igual que sea True o False, pero para una proposición&lt;br /&gt;
         de más a delante necesitamos que sea False*)&lt;br /&gt;
(* jeshorcob: Debe ser False y la función tiene una errata en&lt;br /&gt;
la segunda linea porque la recursión la debe hacer sobre la función &lt;br /&gt;
algunos3  en lugar de todos *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun algunos4  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos4 p [] =False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos4 p (x#xs) = (if p x then True else (algunos4 p xs))&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;
&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1,davoremar, marnajgom&amp;quot; &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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) = &lt;br /&gt;
          ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x∧Q x∧todos P xs∧todos Q xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x∧todos P xs)∧(Q x ∧ todos Q xs))&amp;quot; by arith                  &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = &lt;br /&gt;
                  (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic, marnajgom&amp;quot; (*Muy parecida a la solución anterior*)&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 x 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) (x # xs) = &lt;br /&gt;
      ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also  have &amp;quot;... = ((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ Q x ∧ todos P xs ∧ todos Q xs)&amp;quot; by simp&lt;br /&gt;
  also   have &amp;quot;... = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x # xs) = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma todo_append:&lt;br /&gt;
 &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) = (((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; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) =((todos (λx. P x ∧ Q x) [x]) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos Q [x]) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos P xs) ∧ (todos Q [x] ∧ todos Q xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp (* emimarriv: Esta linea puede suprimirse, pero la dejo porque se sigue&lt;br /&gt;
                                                                            mejor el proceso*)&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) = ((P x ∧ Q x) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs)))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P (x#xs)) ∧ (todos Q (x#xs)))&amp;quot; by auto&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = (todos P (x#xs) ∧ todos Q (x#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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic,davoremar, marnajgom&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a#x)@y) =&lt;br /&gt;
                 (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
(* es igual que la de jeshorcob pero nos podemos ahorrar &lt;br /&gt;
        una linea de comando*)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append2:&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;
-- &amp;quot;juacorvic, marnajgom&amp;quot; &lt;br /&gt;
(* es igual que las anteriores pero salió con mayor nivel de detalle *)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append:  &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;
  also have &amp;quot;... = ((P a ∧ todos P x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... =  (todos P (a # x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x xs&lt;br /&gt;
  assume HI: &amp;quot;todos P (xs @ y) = (todos P xs ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((x#xs) @ y) = ((P x) ∧ (todos P (xs @ y)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x) ∧ (todos P xs ∧ todos P y))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((x#xs) @ y) = (todos P (x#xs) ∧ todos P y)&amp;quot; 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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
apply (induct xs)&lt;br /&gt;
apply (auto simp add: todos_append)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic,davoremar, marnajgom&amp;quot;&lt;br /&gt;
&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;
 &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;
--&amp;quot;jeshorcob, juacorvic, marnajgom&amp;quot;&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 x 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 (x#xs)) = todos P ((rev xs) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [x])&amp;quot; &lt;br /&gt;
              by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [x])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P x)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ todos P xs)&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (x#xs)) = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
&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; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x 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 (x#xs)) = todos P (rev xs @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P (rev xs)) ∧ (todos P [x]))&amp;quot; by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = ((todos P xs) ∧ (todos P [x]))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P xs) ∧ (P x))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (x#xs)) = todos P (x#xs)&amp;quot; by auto&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;
(*Pedrosrei: No sé cómo has conseguido el contraejemplo,&lt;br /&gt;
  probablemente algún fallo en los paréntesis, ya que la propiedad &lt;br /&gt;
  resulta cierta como expongo abajo:&lt;br /&gt;
*)&lt;br /&gt;
(* jeshorcob: el contraejemplo existe. Fijate en lo siguiente: *)&lt;br /&gt;
fun p1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;p1 x = (x=3)&amp;quot;&lt;br /&gt;
fun q1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;q1 x = (x=2)&amp;quot;&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2]&amp;quot; -- &amp;quot;= False &lt;br /&gt;
  (porque ningún elemento de la lista cumple a la vez p1 y q1)&amp;quot;&lt;br /&gt;
value &amp;quot;(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= True &lt;br /&gt;
  (porque cada elemento de la lista cumple una sola de p1 y q1)&amp;quot;&lt;br /&gt;
(*Por tanto:*)&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2] = &lt;br /&gt;
(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
(*Esta es una instancia del contraejemplo que encuentra QuickCheck*)&lt;br /&gt;
&lt;br /&gt;
&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 (metis (full_types) algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Al cambiar la definición de algunos para que coincida con list_ex es cierto el &lt;br /&gt;
contraejemplo de Jesús&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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) = ((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; using HI by simp&lt;br /&gt;
 (* Ya no podemos seguir más ya que no se cuemple: &lt;br /&gt;
      also have &amp;quot;... =  ((P a ∨ algunos P xs) ∧ (Q a ∨ algunos Q xs))   &lt;br /&gt;
   Tenemos que buscar un contraejemplo:&lt;br /&gt;
 *)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv, juacorvic,davoremar, marnajgom&amp;quot;&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 {* Encuentra el contraejemplo&lt;br /&gt;
P = {a⇩1}&lt;br /&gt;
Q = {a⇩2}&lt;br /&gt;
xs = [a⇩1, a⇩2]&lt;br /&gt;
*}&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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar, marnajgom&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv, juacorvic&amp;quot;&lt;br /&gt;
 &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 ∘ 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)) = ((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; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar, marnajgom&amp;quot;&lt;br /&gt;
&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)) = algunos P ((f x) # (map f xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P (f x)) ∨ (algunos P (map f xs)))&amp;quot; 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;
  also have &amp;quot;... = (((P o f) x) ∨ (algunos (P o f) xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (map f (x#xs)) = algunos (P o f) (x#xs)&amp;quot; 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;
(*Pedrosrei: Pongo la automática que parece se os resiste.*) &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (metis algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Si corregís la definición de algunos sería: *)&lt;br /&gt;
&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;
(*jeshorcob: Pedro, a la tuya no sé que le pasa que no me la coge bien. &lt;br /&gt;
Dejo la mía *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic,davoremar, marnajgom&amp;quot;&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv&amp;quot;&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; &lt;br /&gt;
         using HI 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;
(*Igual que anterior, cambia uso de paréntesis y un paso más*)&lt;br /&gt;
-- &amp;quot;juacorvic, marnajgom&amp;quot; &lt;br /&gt;
lemma algunos_append:  &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 by simp&lt;br /&gt;
also have &amp;quot;... = (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x 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 ((x#xs) @ ys) = ((P x) ∨ algunos P (xs @ ys))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x) | (algunos P xs ∨ algunos P ys))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos P ((x#xs) @ ys) = (algunos P (x#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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar, marnajgom&amp;quot;&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;
 &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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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 xs ∨ (P a))&amp;quot; using HI using algunos_append by auto&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;emimarriv&amp;quot;&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 x 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 (x#xs)) = algunos P ((rev xs)@[x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ (P x))&amp;quot; by (auto simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ (P x))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (x#xs)) = algunos P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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;
also have &amp;quot;... =  algunos P (a # xs)&amp;quot; by simp&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;
--&amp;quot;davoremar, marnajgom&amp;quot;&lt;br /&gt;
&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 x 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 (x#xs)) = algunos P ((rev xs) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ (algunos P [x]))&amp;quot; by (simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ algunos P [x])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ (P x))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (rev (x#xs)) = algunos P (x#xs)&amp;quot; by auto&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x 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) (x # xs) = ((P x ∨ Q x) &lt;br /&gt;
          ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x ∨ Q x) ∨ (algunos P xs ∨ algunos Q xs))&amp;quot; &lt;br /&gt;
              using hi by simp&lt;br /&gt;
  also have &amp;quot;... = (P x  ∨ algunos P xs ∨ Q x ∨ algunos Q xs)&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot; algunos (λx. P x ∨ Q x) (x # xs) =&lt;br /&gt;
                  (algunos P (x # xs) ∨ algunos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x 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) (x#xs) = (P x ∨ Q x ∨ algunos (λx. P x | Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∨ Q x ∨ algunos P xs ∨ algunos Q xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos (λx. P x ∨ Q x) (x#xs) = (algunos P (x#xs) ∨ algunos Q (x#xs))&amp;quot; by auto&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;
(*Pedrosrei: Es falso.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo P= esVacio, xs = []. P es la propiedad de ser vacío&lt;br /&gt;
con nuestra construcción de algunos es cierto &amp;quot;algunos esVacio []&amp;quot;&lt;br /&gt;
Sin embargo, todos (λx. (¬ esVacio {})) [] es lo mismo que &lt;br /&gt;
todos _ [] = True, por lo que ¬(todos (λx. (¬ esVacio {})) []) = False,&lt;br /&gt;
siendo falsa nuestra definición. Podemos coger de todas maneras la propiedad&lt;br /&gt;
que queramos y sigue siendo falso porque &lt;br /&gt;
(algunos _ [] True) ∧ (¬(todos _ [])= False)&lt;br /&gt;
 *)&lt;br /&gt;
lemma &lt;br /&gt;
shows &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Al corregir la definición de &amp;quot;algunos&amp;quot; deja de ser cierto lo dicho y &lt;br /&gt;
correcto lo de abajo.&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: está claro que el fallo en todo era la definición esa*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar, marnajgom&amp;quot;&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;
&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;
-- &amp;quot;javrodviv1, jeshorcob,davoremar&amp;quot;&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;
  finally show &amp;quot;algunos P (a # xs) =(¬ todos (λx. ¬ P x) (a#xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic, marnajgom&amp;quot;&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;... = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; by simp &lt;br /&gt;
(* Este paso lo he puesto por inercia de otras demostraciones&lt;br /&gt;
pero realmente no veo como hacerlo más detallado *)&lt;br /&gt;
finally show  &amp;quot;algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; 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;
-- &amp;quot;javrodviv1, jeshorcob,davoremar&amp;quot; &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) = ((x=a) ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic, marnajgom&amp;quot; &lt;br /&gt;
(*Si cambiamos el orden de la igualdad no tenemos que&lt;br /&gt;
utilizar auto en la demostración*)&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;
&lt;br /&gt;
value &amp;quot;estaEn (2::nat) [3,2,4]&amp;quot; --&amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;estaEn (1::nat) [3,2,4]&amp;quot; --&amp;quot;= 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;
--&amp;quot;jeshorcob,juacorvic,davoremar, marnajgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&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;estaEn y (x#xs) = (y=x ∨ estaEn y xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (y=x ∨ algunos (λx. (x=y)) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic, marnajgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
show &amp;quot;algunos (λx. x = y) [] = estaEn y []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos (λx. x = y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
have &amp;quot;algunos (λx. x = y) (a # xs) =  (a = y ∨ algunos (λx. x = y) xs)&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = (a = y ∨ estaEn y xs)&amp;quot; using HI by simp &lt;br /&gt;
also have &amp;quot;... = (estaEn y (a # xs))&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos (λx. x = y) (a # xs) = estaEn y (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (x#xs) = (estaEn x xs ∨ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: Esta definición no es correcta. Véanse:*)&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, juacorvic,davoremar, marnajgom&amp;quot;&lt;br /&gt;
fun sinDuplicados2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados2 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;sinDuplicados2 (x#xs) = (¬(estaEn x xs) ∧ sinDuplicados2 xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun sinDuplicados3 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados3 [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados3 (x#xs) = (if estaEn x xs then False else sinDuplicados3 xs )&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
 &lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar, marnajgom&amp;quot; &lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (x#xs) = (if estaEn x xs then borraDuplicados xs else (x#(borraDuplicados xs)))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.1. Demostrar o refutar automáticamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar&amp;quot; &lt;br /&gt;
lemma &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.2. Demostrar o refutar detalladamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob,davoremar&amp;quot; &lt;br /&gt;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a#xs))≤length (a#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 1+ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1+ length xs&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*Igual pero con 1 paso más*)&lt;br /&gt;
lemma length_borraDuplicados: &lt;br /&gt;
   &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs &lt;br /&gt;
  assume HI: &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1 + length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1 + length xs&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
(*Nota: así conseguimos demostrar el caso de que el elemento &amp;#039;a&amp;#039; no esté repetido&lt;br /&gt;
en la lista. Que pasa con la demostración para el caso de una lista cuyos los elementos &lt;br /&gt;
sean todos duplicados. Por ejemplo [1::nat,1,1,1,1,1,1].&lt;br /&gt;
Esto no se reduce:&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a # xs)) ≤ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;marnajgom&amp;quot; &lt;br /&gt;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs) &lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a &lt;br /&gt;
  fix xs&lt;br /&gt;
  assume HI: &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  show &amp;quot;length (borraDuplicados (a # xs))  ≤ length (a # xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume H1:&amp;quot;estaEn a xs&amp;quot;&lt;br /&gt;
    have &amp;quot;length (borraDuplicados (a # xs)) = length (borraDuplicados xs)&amp;quot; using H1 by simp&lt;br /&gt;
    also have &amp;quot;... ≤ length xs&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... ≤ 1+length xs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... ≤ length (a#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis.&lt;br /&gt;
  next&lt;br /&gt;
    assume H2: &amp;quot;¬estaEn a xs&amp;quot;&lt;br /&gt;
    have &amp;quot;length (borraDuplicados (a # xs)) = length (a# borraDuplicados xs)&amp;quot; using H2 by simp&lt;br /&gt;
    also have &amp;quot;... = 1+ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... ≤ 1+ length xs&amp;quot; using HI by simp         &lt;br /&gt;
    also have &amp;quot;... ≤ length (a#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis.&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.1. Demostrar o refutar automáticamente &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic,davoremar, marnajgom&amp;quot; &lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
apply (induct xs, auto)&lt;br /&gt;
done&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.2. Demostrar o refutar detalladamente&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: con esta definición de borraDuplicados es falso si cogemos&lt;br /&gt;
xs= []. Además del quickcheck, podemos hacer &amp;quot;apply (induct xs, auto)&amp;quot; &lt;br /&gt;
y ver que nos pide que demostremos False.&lt;br /&gt;
*)&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: dejo la prueba por inducción y casos*)&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (x#xs)) = estaEn a (x#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume a1:&amp;quot;estaEn x xs&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) = &lt;br /&gt;
                estaEn a (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a (x#xs)&amp;quot; using a1 by auto&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume a2:&amp;quot;¬(estaEn x xs)&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) =&lt;br /&gt;
                estaEn a (x#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (a = x ∨ estaEn a (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis using hi by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;juacorvic, marnajgom&amp;quot;&lt;br /&gt;
(* Es identica a la anterior, salvo un paso que no se resuelve. &lt;br /&gt;
Tampoco entiendo que aplica jeshorcob en ese paso *)&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next  &lt;br /&gt;
  fix aa xs&lt;br /&gt;
  assume HI: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot; &lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (aa # xs)) = estaEn a (aa # xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume HI1: &amp;quot;estaEn aa xs&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (aa # xs)) = estaEn a (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a xs&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a (aa # xs)&amp;quot; using HI1 by auto (*marnajgom: Así me funciona a mi*)&lt;br /&gt;
    finally show &amp;quot;estaEn a (borraDuplicados (aa # xs)) = estaEn a (aa # xs)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  assume HI2: &amp;quot;¬(estaEn aa xs)&amp;quot;&lt;br /&gt;
  then have &amp;quot;estaEn a (borraDuplicados (aa # xs)) = estaEn a (aa#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (aa = a ∨ estaEn a (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (aa =a ∨  estaEn a xs) &amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = estaEn a (aa # xs)&amp;quot; using HI2 by simp (*marnajgom: te faltaba using HI2*)&lt;br /&gt;
(*  also have &amp;quot;... = estaEn a (aa # xs)&amp;quot; by simp  --juacorvic: Tal y como lo tenía funciona *)&lt;br /&gt;
  finally show &amp;quot;estaEn a (borraDuplicados (aa # xs)) = estaEn a (aa # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.1. Demostrar o refutar automáticamente &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, marnajgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: estaEn_borraDuplicados)&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.2. Demostrar o refutar detalladamente&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados2 (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume hi: &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;sinDuplicados2 (borraDuplicados (x#xs)) =&lt;br /&gt;
          sinDuplicados2 ((if estaEn x xs then borraDuplicados xs &lt;br /&gt;
                           else x # borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (if estaEn x xs &lt;br /&gt;
                      then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                    else sinDuplicados2 (x#borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs)&lt;br /&gt;
                   else (¬estaEn x (borraDuplicados xs) &lt;br /&gt;
                          ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                   else (¬estaEn x xs ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot;&lt;br /&gt;
                     by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
then show &amp;quot;sinDuplicados2 (borraDuplicados (x#xs))&amp;quot; &lt;br /&gt;
             using hi by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;marnajgom&amp;quot;&lt;br /&gt;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs) &lt;br /&gt;
  show &amp;quot;sinDuplicados (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot; &lt;br /&gt;
  show &amp;quot;sinDuplicados (borraDuplicados (a # xs))&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume H1: &amp;quot;estaEn a xs&amp;quot;&lt;br /&gt;
    thus &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot; using HI by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume H2: &amp;quot;¬estaEn a xs&amp;quot; &lt;br /&gt;
    thus &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot; using HI by (auto simp add:estaEn_borraDuplicados)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
 (*Pedrosrei: es falso, como podemos ver si cogemos [1,2,1] y evaluamos:&lt;br /&gt;
*)&lt;br /&gt;
lemma &amp;quot;borraDuplicados&amp;#039; (rev xs) = rev (borraDuplicados&amp;#039; xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar, marnajgom&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
borraDuplicados (rev xs) = [a⇩2, a⇩1]&lt;br /&gt;
rev (borraDuplicados xs) = [a⇩1, a⇩2]&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=148</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=148"/>
		<updated>2014-11-20T09:19:17Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R5: Cuantificadores sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
theory R5&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic,davoremar&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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 xs =  foldr (λx. op ∧ (p x)) xs True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun todos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos3 p [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos3 p (x#xs) = (if p x then (todos3 p xs) else False)&amp;quot;&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;
(* Errata. Debe ser False el caso base seguro porque si no,&lt;br /&gt;
 la función devuelve siempre True*)&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1,juacorvic,davoremar&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun algunos2 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos2 p xs =  foldr (λx. op ∨ (p x)) xs False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;algunos (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
value &amp;quot;algunos2 (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun algunos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos3 p [] = False&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos3 p (x#xs) = (p x ∨ todos p xs)&amp;quot;&lt;br /&gt;
(* Nota. Nos da igual que sea True o False, pero para una proposición&lt;br /&gt;
         de más a delante necesitamos que sea False*)&lt;br /&gt;
(* jeshorcob: Debe ser False y la función tiene una errata en&lt;br /&gt;
la segunda linea porque la recursión la debe hacer sobre la función &lt;br /&gt;
algunos3  en lugar de todos *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun algunos4  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos4 p [] =False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos4 p (x#xs) = (if p x then True else (algunos4 p xs))&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;
&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1,davoremar&amp;quot; &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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) = &lt;br /&gt;
          ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x∧Q x∧todos P xs∧todos Q xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x∧todos P xs)∧(Q x ∧ todos Q xs))&amp;quot; by arith                  &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = &lt;br /&gt;
                  (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; (*Muy parecida a la solución anterior*)&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 x 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) (x # xs) = &lt;br /&gt;
      ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also  have &amp;quot;... = ((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ Q x ∧ todos P xs ∧ todos Q xs)&amp;quot; by simp&lt;br /&gt;
  also   have &amp;quot;... = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x # xs) = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma todo_append:&lt;br /&gt;
 &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) = (((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; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) =((todos (λx. P x ∧ Q x) [x]) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos Q [x]) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos P xs) ∧ (todos Q [x] ∧ todos Q xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp (* emimarriv: Esta linea puede suprimirse, pero la dejo porque se sigue&lt;br /&gt;
                                                                            mejor el proceso*)&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) = ((P x ∧ Q x) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs)))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P (x#xs)) ∧ (todos Q (x#xs)))&amp;quot; by auto&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = (todos P (x#xs) ∧ todos Q (x#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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic,davoremar&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a#x)@y) =&lt;br /&gt;
                 (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
(* es igual que la de jeshorcob pero nos podemos ahorrar &lt;br /&gt;
        una linea de comando*)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append2:&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;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* es igual que las anteriores pero salió con mayor nivel de detalle *)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append:  &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;
  also have &amp;quot;... = ((P a ∧ todos P x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... =  (todos P (a # x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x xs&lt;br /&gt;
  assume HI: &amp;quot;todos P (xs @ y) = (todos P xs ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((x#xs) @ y) = ((P x) ∧ (todos P (xs @ y)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x) ∧ (todos P xs ∧ todos P y))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((x#xs) @ y) = (todos P (x#xs) ∧ todos P y)&amp;quot; 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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
apply (induct xs)&lt;br /&gt;
apply (auto simp add: todos_append)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic,davoremar&amp;quot;&lt;br /&gt;
&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;
 &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;
--&amp;quot;jeshorcob, juacorvic&amp;quot;&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 x 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 (x#xs)) = todos P ((rev xs) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [x])&amp;quot; &lt;br /&gt;
              by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [x])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P x)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ todos P xs)&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (x#xs)) = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
&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; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x 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 (x#xs)) = todos P (rev xs @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P (rev xs)) ∧ (todos P [x]))&amp;quot; by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = ((todos P xs) ∧ (todos P [x]))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P xs) ∧ (P x))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (x#xs)) = todos P (x#xs)&amp;quot; by auto&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;
(*Pedrosrei: No sé cómo has conseguido el contraejemplo,&lt;br /&gt;
  probablemente algún fallo en los paréntesis, ya que la propiedad &lt;br /&gt;
  resulta cierta como expongo abajo:&lt;br /&gt;
*)&lt;br /&gt;
(* jeshorcob: el contraejemplo existe. Fijate en lo siguiente: *)&lt;br /&gt;
fun p1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;p1 x = (x=3)&amp;quot;&lt;br /&gt;
fun q1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;q1 x = (x=2)&amp;quot;&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2]&amp;quot; -- &amp;quot;= False &lt;br /&gt;
  (porque ningún elemento de la lista cumple a la vez p1 y q1)&amp;quot;&lt;br /&gt;
value &amp;quot;(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= True &lt;br /&gt;
  (porque cada elemento de la lista cumple una sola de p1 y q1)&amp;quot;&lt;br /&gt;
(*Por tanto:*)&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2] = &lt;br /&gt;
(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
(*Esta es una instancia del contraejemplo que encuentra QuickCheck*)&lt;br /&gt;
&lt;br /&gt;
&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 (metis (full_types) algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Al cambiar la definición de algunos para que coincida con list_ex es cierto el &lt;br /&gt;
contraejemplo de Jesús&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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) = ((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; using HI by simp&lt;br /&gt;
 (* Ya no podemos seguir más ya que no se cuemple: &lt;br /&gt;
      also have &amp;quot;... =  ((P a ∨ algunos P xs) ∧ (Q a ∨ algunos Q xs))   &lt;br /&gt;
   Tenemos que buscar un contraejemplo:&lt;br /&gt;
 *)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv, juacorvic,davoremar&amp;quot;&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 {* Encuentra el contraejemplo&lt;br /&gt;
P = {a⇩1}&lt;br /&gt;
Q = {a⇩2}&lt;br /&gt;
xs = [a⇩1, a⇩2]&lt;br /&gt;
*}&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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv, juacorvic&amp;quot;&lt;br /&gt;
 &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 ∘ 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)) = ((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; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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)) = algunos P ((f x) # (map f xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P (f x)) ∨ (algunos P (map f xs)))&amp;quot; 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;
  also have &amp;quot;... = (((P o f) x) ∨ (algunos (P o f) xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (map f (x#xs)) = algunos (P o f) (x#xs)&amp;quot; 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;
(*Pedrosrei: Pongo la automática que parece se os resiste.*) &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (metis algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Si corregís la definición de algunos sería: *)&lt;br /&gt;
&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;
(*jeshorcob: Pedro, a la tuya no sé que le pasa que no me la coge bien. &lt;br /&gt;
Dejo la mía *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic,davoremar&amp;quot;&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv&amp;quot;&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; &lt;br /&gt;
         using HI 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;
(*Igual que anterior, cambia uso de paréntesis y un paso más*)&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
lemma algunos_append:  &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 by simp&lt;br /&gt;
also have &amp;quot;... = (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x 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 ((x#xs) @ ys) = ((P x) ∨ algunos P (xs @ ys))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x) | (algunos P xs ∨ algunos P ys))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos P ((x#xs) @ ys) = (algunos P (x#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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar&amp;quot;&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;
 &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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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 xs ∨ (P a))&amp;quot; using HI using algunos_append by auto&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;emimarriv&amp;quot;&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 x 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 (x#xs)) = algunos P ((rev xs)@[x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ (P x))&amp;quot; by (auto simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ (P x))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (x#xs)) = algunos P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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;
also have &amp;quot;... =  algunos P (a # xs)&amp;quot; by simp&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;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x 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 (x#xs)) = algunos P ((rev xs) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ (algunos P [x]))&amp;quot; by (simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ algunos P [x])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ (P x))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (rev (x#xs)) = algunos P (x#xs)&amp;quot; by auto&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x 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) (x # xs) = ((P x ∨ Q x) &lt;br /&gt;
          ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x ∨ Q x) ∨ (algunos P xs ∨ algunos Q xs))&amp;quot; &lt;br /&gt;
              using hi by simp&lt;br /&gt;
  also have &amp;quot;... = (P x  ∨ algunos P xs ∨ Q x ∨ algunos Q xs)&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot; algunos (λx. P x ∨ Q x) (x # xs) =&lt;br /&gt;
                  (algunos P (x # xs) ∨ algunos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x 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) (x#xs) = (P x ∨ Q x ∨ algunos (λx. P x | Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∨ Q x ∨ algunos P xs ∨ algunos Q xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos (λx. P x ∨ Q x) (x#xs) = (algunos P (x#xs) ∨ algunos Q (x#xs))&amp;quot; by auto&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;
(*Pedrosrei: Es falso.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo P= esVacio, xs = []. P es la propiedad de ser vacío&lt;br /&gt;
con nuestra construcción de algunos es cierto &amp;quot;algunos esVacio []&amp;quot;&lt;br /&gt;
Sin embargo, todos (λx. (¬ esVacio {})) [] es lo mismo que &lt;br /&gt;
todos _ [] = True, por lo que ¬(todos (λx. (¬ esVacio {})) []) = False,&lt;br /&gt;
siendo falsa nuestra definición. Podemos coger de todas maneras la propiedad&lt;br /&gt;
que queramos y sigue siendo falso porque &lt;br /&gt;
(algunos _ [] True) ∧ (¬(todos _ [])= False)&lt;br /&gt;
 *)&lt;br /&gt;
lemma &lt;br /&gt;
shows &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Al corregir la definición de &amp;quot;algunos&amp;quot; deja de ser cierto lo dicho y &lt;br /&gt;
correcto lo de abajo.&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: está claro que el fallo en todo era la definición esa*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar&amp;quot;&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;
&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;
-- &amp;quot;javrodviv1, jeshorcob,davoremar&amp;quot;&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;
  finally show &amp;quot;algunos P (a # xs) =(¬ todos (λx. ¬ P x) (a#xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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;... = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; by simp &lt;br /&gt;
(* Este paso lo he puesto por inercia de otras demostraciones&lt;br /&gt;
pero realmente no veo como hacerlo más detallado *)&lt;br /&gt;
finally show  &amp;quot;algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; 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;
-- &amp;quot;javrodviv1, jeshorcob,davoremar&amp;quot; &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) = ((x=a) ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Si cambiamos el orden de la igualdad no tenemos que&lt;br /&gt;
utilizar auto en la demostración*)&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;
&lt;br /&gt;
value &amp;quot;estaEn (2::nat) [3,2,4]&amp;quot; --&amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;estaEn (1::nat) [3,2,4]&amp;quot; --&amp;quot;= 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;
--&amp;quot;jeshorcob,juacorvic,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&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;estaEn y (x#xs) = (y=x ∨ estaEn y xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (y=x ∨ algunos (λx. (x=y)) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
show &amp;quot;algunos (λx. x = y) [] = estaEn y []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos (λx. x = y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
have &amp;quot;algunos (λx. x = y) (a # xs) =  (a = y ∨ algunos (λx. x = y) xs)&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = (a = y ∨ estaEn y xs)&amp;quot; using HI by simp &lt;br /&gt;
also have &amp;quot;... = (estaEn y (a # xs))&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos (λx. x = y) (a # xs) = estaEn y (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (x#xs) = (estaEn x xs ∨ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: Esta definición no es correcta. Véanse:*)&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, juacorvic,davoremar&amp;quot;&lt;br /&gt;
fun sinDuplicados2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados2 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;sinDuplicados2 (x#xs) = (¬(estaEn x xs) ∧ sinDuplicados2 xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun sinDuplicados3 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados3 [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados3 (x#xs) = (if estaEn x xs then False else sinDuplicados3 xs )&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
 &lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar&amp;quot; &lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (x#xs) = (if estaEn x xs then borraDuplicados xs else (x#(borraDuplicados xs)))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.1. Demostrar o refutar automáticamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar&amp;quot; &lt;br /&gt;
lemma &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.2. Demostrar o refutar detalladamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob,davoremar&amp;quot; &lt;br /&gt;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a#xs))≤length (a#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 1+ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1+ length xs&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*Igual pero con 1 paso más*)&lt;br /&gt;
lemma length_borraDuplicados: &lt;br /&gt;
   &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs &lt;br /&gt;
  assume HI: &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1 + length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1 + length xs&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
(*Nota: así conseguimos demostrar el caso de que el elemento &amp;#039;a&amp;#039; no esté repetido&lt;br /&gt;
en la lista. Que pasa con la demostración para el caso de una lista cuyos los elementos &lt;br /&gt;
sean todos duplicados. Por ejemplo [1::nat,1,1,1,1,1,1].&lt;br /&gt;
Esto no se reduce:&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a # xs)) ≤ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.1. Demostrar o refutar automáticamente &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic,davoremar&amp;quot; &lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
apply (induct xs, auto)&lt;br /&gt;
done&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.2. Demostrar o refutar detalladamente&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: con esta definición de borraDuplicados es falso si cogemos&lt;br /&gt;
xs= []. Además del quickcheck, podemos hacer &amp;quot;apply (induct xs, auto)&amp;quot; &lt;br /&gt;
y ver que nos pide que demostremos False.&lt;br /&gt;
*)&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: dejo la prueba por inducción y casos*)&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (x#xs)) = estaEn a (x#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume a1:&amp;quot;estaEn x xs&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) = &lt;br /&gt;
                estaEn a (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a (x#xs)&amp;quot; using a1 by auto&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume a2:&amp;quot;¬(estaEn x xs)&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) =&lt;br /&gt;
                estaEn a (x#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (a = x ∨ estaEn a (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis using hi by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(* Es identica a la anterior, salvo un paso que no se resuelve. &lt;br /&gt;
Tampoco entiendo que aplica jeshorcob en ese paso *)&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next  &lt;br /&gt;
  fix aa xs&lt;br /&gt;
  assume HI: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot; &lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (aa # xs)) = estaEn a (aa # xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume HI1: &amp;quot;estaEn aa xs&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (aa # xs)) = estaEn a (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a xs&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a (aa # xs)&amp;quot; by simp (* Este paso no se resuelve *)&lt;br /&gt;
    finally show &amp;quot;estaEn a (borraDuplicados (aa # xs)) = estaEn a (aa # xs)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  assume HI2: &amp;quot;¬(estaEn aa xs)&amp;quot;&lt;br /&gt;
  then have &amp;quot;estaEn a (borraDuplicados (aa # xs)) = estaEn a (aa#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (aa = a ∨ estaEn a (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (aa =a ∨  estaEn a xs) &amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = estaEn a (aa # xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;estaEn a (borraDuplicados (aa # xs)) = estaEn a (aa # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.1. Demostrar o refutar automáticamente &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: estaEn_borraDuplicados)&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.2. Demostrar o refutar detalladamente&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados2 (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume hi: &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;sinDuplicados2 (borraDuplicados (x#xs)) =&lt;br /&gt;
          sinDuplicados2 ((if estaEn x xs then borraDuplicados xs &lt;br /&gt;
                           else x # borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (if estaEn x xs &lt;br /&gt;
                      then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                    else sinDuplicados2 (x#borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs)&lt;br /&gt;
                   else (¬estaEn x (borraDuplicados xs) &lt;br /&gt;
                          ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                   else (¬estaEn x xs ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot;&lt;br /&gt;
                     by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
then show &amp;quot;sinDuplicados2 (borraDuplicados (x#xs))&amp;quot; &lt;br /&gt;
             using hi by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
 (*Pedrosrei: es falso, como podemos ver si cogemos [1,2,1] y evaluamos:&lt;br /&gt;
*)&lt;br /&gt;
lemma &amp;quot;borraDuplicados&amp;#039; (rev xs) = rev (borraDuplicados&amp;#039; xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
borraDuplicados (rev xs) = [a⇩2, a⇩1]&lt;br /&gt;
rev (borraDuplicados xs) = [a⇩1, a⇩2]&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=147</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=147"/>
		<updated>2014-11-20T07:57:33Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R5: Cuantificadores sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
theory R5&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic,davoremar&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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 xs =  foldr (λx. op ∧ (p x)) xs True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun todos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos3 p [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos3 p (x#xs) = (if p x then (todos3 p xs) else False)&amp;quot;&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;
(* Errata. Debe ser False el caso base seguro porque si no,&lt;br /&gt;
 la función devuelve siempre True*)&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1,juacorvic,davoremar&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun algunos2 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos2 p xs =  foldr (λx. op ∨ (p x)) xs False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;algunos (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
value &amp;quot;algunos2 (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun algunos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos3 p [] = False&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos3 p (x#xs) = (p x ∨ todos p xs)&amp;quot;&lt;br /&gt;
(* Nota. Nos da igual que sea True o False, pero para una proposición&lt;br /&gt;
         de más a delante necesitamos que sea False*)&lt;br /&gt;
(* jeshorcob: Debe ser False y la función tiene una errata en&lt;br /&gt;
la segunda linea porque la recursión la debe hacer sobre la función &lt;br /&gt;
algunos3  en lugar de todos *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun algunos4  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos4 p [] =False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos4 p (x#xs) = (if p x then True else (algunos4 p xs))&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;
&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1,davoremar&amp;quot; &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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) = &lt;br /&gt;
          ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x∧Q x∧todos P xs∧todos Q xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x∧todos P xs)∧(Q x ∧ todos Q xs))&amp;quot; by arith                  &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = &lt;br /&gt;
                  (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; (*Muy parecida a la solución anterior*)&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 x 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) (x # xs) = &lt;br /&gt;
      ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also  have &amp;quot;... = ((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ Q x ∧ todos P xs ∧ todos Q xs)&amp;quot; by simp&lt;br /&gt;
  also   have &amp;quot;... = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x # xs) = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma todo_append:&lt;br /&gt;
 &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) = (((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; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) =((todos (λx. P x ∧ Q x) [x]) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos Q [x]) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos P xs) ∧ (todos Q [x] ∧ todos Q xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp (* emimarriv: Esta linea puede suprimirse, pero la dejo porque se sigue&lt;br /&gt;
                                                                            mejor el proceso*)&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) = ((P x ∧ Q x) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs)))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P (x#xs)) ∧ (todos Q (x#xs)))&amp;quot; by auto&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = (todos P (x#xs) ∧ todos Q (x#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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic,davoremar&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a#x)@y) =&lt;br /&gt;
                 (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
(* es igual que la de jeshorcob pero nos podemos ahorrar &lt;br /&gt;
        una linea de comando*)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append2:&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;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* es igual que las anteriores pero salió con mayor nivel de detalle *)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append:  &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;
  also have &amp;quot;... = ((P a ∧ todos P x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... =  (todos P (a # x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x xs&lt;br /&gt;
  assume HI: &amp;quot;todos P (xs @ y) = (todos P xs ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((x#xs) @ y) = ((P x) ∧ (todos P (xs @ y)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x) ∧ (todos P xs ∧ todos P y))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((x#xs) @ y) = (todos P (x#xs) ∧ todos P y)&amp;quot; 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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
apply (induct xs)&lt;br /&gt;
apply (auto simp add: todos_append)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic,davoremar&amp;quot;&lt;br /&gt;
&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;
 &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;
--&amp;quot;jeshorcob, juacorvic&amp;quot;&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 x 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 (x#xs)) = todos P ((rev xs) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [x])&amp;quot; &lt;br /&gt;
              by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [x])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P x)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ todos P xs)&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (x#xs)) = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
&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; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x 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 (x#xs)) = todos P (rev xs @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P (rev xs)) ∧ (todos P [x]))&amp;quot; by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = ((todos P xs) ∧ (todos P [x]))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P xs) ∧ (P x))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (x#xs)) = todos P (x#xs)&amp;quot; by auto&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;
(*Pedrosrei: No sé cómo has conseguido el contraejemplo,&lt;br /&gt;
  probablemente algún fallo en los paréntesis, ya que la propiedad &lt;br /&gt;
  resulta cierta como expongo abajo:&lt;br /&gt;
*)&lt;br /&gt;
(* jeshorcob: el contraejemplo existe. Fijate en lo siguiente: *)&lt;br /&gt;
fun p1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;p1 x = (x=3)&amp;quot;&lt;br /&gt;
fun q1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;q1 x = (x=2)&amp;quot;&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2]&amp;quot; -- &amp;quot;= False &lt;br /&gt;
  (porque ningún elemento de la lista cumple a la vez p1 y q1)&amp;quot;&lt;br /&gt;
value &amp;quot;(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= True &lt;br /&gt;
  (porque cada elemento de la lista cumple una sola de p1 y q1)&amp;quot;&lt;br /&gt;
(*Por tanto:*)&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2] = &lt;br /&gt;
(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
(*Esta es una instancia del contraejemplo que encuentra QuickCheck*)&lt;br /&gt;
&lt;br /&gt;
&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 (metis (full_types) algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Al cambiar la definición de algunos para que coincida con list_ex es cierto el &lt;br /&gt;
contraejemplo de Jesús&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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) = ((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; using HI by simp&lt;br /&gt;
 (* Ya no podemos seguir más ya que no se cuemple: &lt;br /&gt;
      also have &amp;quot;... =  ((P a ∨ algunos P xs) ∧ (Q a ∨ algunos Q xs))   &lt;br /&gt;
   Tenemos que buscar un contraejemplo:&lt;br /&gt;
 *)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv, juacorvic,davoremar&amp;quot;&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 {* Encuentra el contraejemplo&lt;br /&gt;
P = {a⇩1}&lt;br /&gt;
Q = {a⇩2}&lt;br /&gt;
xs = [a⇩1, a⇩2]&lt;br /&gt;
*}&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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv, juacorvic&amp;quot;&lt;br /&gt;
 &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 ∘ 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)) = ((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; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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)) = algunos P ((f x) # (map f xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P (f x)) ∨ (algunos P (map f xs)))&amp;quot; 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;
  also have &amp;quot;... = (((P o f) x) ∨ (algunos (P o f) xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (map f (x#xs)) = algunos (P o f) (x#xs)&amp;quot; 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;
(*Pedrosrei: Pongo la automática que parece se os resiste.*) &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (metis algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Si corregís la definición de algunos sería: *)&lt;br /&gt;
&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;
(*jeshorcob: Pedro, a la tuya no sé que le pasa que no me la coge bien. &lt;br /&gt;
Dejo la mía *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic,davoremar&amp;quot;&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv&amp;quot;&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; &lt;br /&gt;
         using HI 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;
(*Igual que anterior, cambia uso de paréntesis y un paso más*)&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
lemma algunos_append:  &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 by simp&lt;br /&gt;
also have &amp;quot;... = (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x 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 ((x#xs) @ ys) = ((P x) ∨ algunos P (xs @ ys))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x) | (algunos P xs ∨ algunos P ys))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos P ((x#xs) @ ys) = (algunos P (x#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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar&amp;quot;&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;
 &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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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 xs ∨ (P a))&amp;quot; using HI using algunos_append by auto&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;emimarriv&amp;quot;&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 x 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 (x#xs)) = algunos P ((rev xs)@[x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ (P x))&amp;quot; by (auto simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ (P x))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (x#xs)) = algunos P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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;
also have &amp;quot;... =  algunos P (a # xs)&amp;quot; by simp&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;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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 x 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 (x#xs)) = algunos P ((rev xs) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ (algunos P [x]))&amp;quot; by (simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ algunos P [x])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ (P x))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (rev (x#xs)) = algunos P (x#xs)&amp;quot; by auto&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;
--&amp;quot;jeshorcob,davoremar&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x 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) (x # xs) = ((P x ∨ Q x) &lt;br /&gt;
          ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x ∨ Q x) ∨ (algunos P xs ∨ algunos Q xs))&amp;quot; &lt;br /&gt;
              using hi by simp&lt;br /&gt;
  also have &amp;quot;... = (P x  ∨ algunos P xs ∨ Q x ∨ algunos Q xs)&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot; algunos (λx. P x ∨ Q x) (x # xs) =&lt;br /&gt;
                  (algunos P (x # xs) ∨ algunos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;davoremar&amp;quot;&lt;br /&gt;
&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; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x 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) (x#xs) = (P x ∨ Q x ∨ algunos (λx. P x | Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∨ Q x ∨ algunos P xs ∨ algunos Q xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos (λx. P x ∨ Q x) (x#xs) = (algunos P (x#xs) ∨ algunos Q (x#xs))&amp;quot; by auto&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;
(*Pedrosrei: Es falso.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo P= esVacio, xs = []. P es la propiedad de ser vacío&lt;br /&gt;
con nuestra construcción de algunos es cierto &amp;quot;algunos esVacio []&amp;quot;&lt;br /&gt;
Sin embargo, todos (λx. (¬ esVacio {})) [] es lo mismo que &lt;br /&gt;
todos _ [] = True, por lo que ¬(todos (λx. (¬ esVacio {})) []) = False,&lt;br /&gt;
siendo falsa nuestra definición. Podemos coger de todas maneras la propiedad&lt;br /&gt;
que queramos y sigue siendo falso porque &lt;br /&gt;
(algunos _ [] True) ∧ (¬(todos _ [])= False)&lt;br /&gt;
 *)&lt;br /&gt;
lemma &lt;br /&gt;
shows &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Al corregir la definición de &amp;quot;algunos&amp;quot; deja de ser cierto lo dicho y &lt;br /&gt;
correcto lo de abajo.&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: está claro que el fallo en todo era la definición esa*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar&amp;quot;&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;
&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;
-- &amp;quot;javrodviv1, jeshorcob,davoremar&amp;quot;&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;
  finally show &amp;quot;algunos P (a # xs) =(¬ todos (λx. ¬ P x) (a#xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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;... = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; by simp &lt;br /&gt;
(* Este paso lo he puesto por inercia de otras demostraciones&lt;br /&gt;
pero realmente no veo como hacerlo más detallado *)&lt;br /&gt;
finally show  &amp;quot;algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; 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;
-- &amp;quot;javrodviv1, jeshorcob,davoremar&amp;quot; &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) = ((x=a) ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Si cambiamos el orden de la igualdad no tenemos que&lt;br /&gt;
utilizar auto en la demostración*)&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;
&lt;br /&gt;
value &amp;quot;estaEn (2::nat) [3,2,4]&amp;quot; --&amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;estaEn (1::nat) [3,2,4]&amp;quot; --&amp;quot;= 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;
--&amp;quot;jeshorcob,juacorvic,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&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;estaEn y (x#xs) = (y=x ∨ estaEn y xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (y=x ∨ algunos (λx. (x=y)) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
show &amp;quot;algunos (λx. x = y) [] = estaEn y []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos (λx. x = y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
have &amp;quot;algunos (λx. x = y) (a # xs) =  (a = y ∨ algunos (λx. x = y) xs)&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = (a = y ∨ estaEn y xs)&amp;quot; using HI by simp &lt;br /&gt;
also have &amp;quot;... = (estaEn y (a # xs))&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos (λx. x = y) (a # xs) = estaEn y (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (x#xs) = (estaEn x xs ∨ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: Esta definición no es correcta. Véanse:*)&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, juacorvic,davoremar&amp;quot;&lt;br /&gt;
fun sinDuplicados2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados2 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;sinDuplicados2 (x#xs) = (¬(estaEn x xs) ∧ sinDuplicados2 xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun sinDuplicados3 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados3 [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados3 (x#xs) = (if estaEn x xs then False else sinDuplicados3 xs )&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
 &lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar&amp;quot; &lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (x#xs) = (if estaEn x xs then borraDuplicados xs else (x#(borraDuplicados xs)))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.1. Demostrar o refutar automáticamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic,davoremar&amp;quot; &lt;br /&gt;
lemma &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.2. Demostrar o refutar detalladamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob,davoremar&amp;quot; &lt;br /&gt;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a#xs))≤length (a#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 1+ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1+ length xs&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*Igual pero con 1 paso más*)&lt;br /&gt;
lemma length_borraDuplicados: &lt;br /&gt;
   &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs &lt;br /&gt;
  assume HI: &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1 + length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1 + length xs&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
(*Nota: así conseguimos demostrar el caso de que el elemento &amp;#039;a&amp;#039; no esté repetido&lt;br /&gt;
en la lista. Que pasa con la demostración para el caso de una lista cuyos los elementos &lt;br /&gt;
sean todos duplicados. Por ejemplo [1::nat,1,1,1,1,1,1].&lt;br /&gt;
Esto no se reduce:&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a # xs)) ≤ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.1. Demostrar o refutar automáticamente &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic,davoremar&amp;quot; &lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
apply (induct xs, auto)&lt;br /&gt;
done&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.2. Demostrar o refutar detalladamente&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: con esta definición de borraDuplicados es falso si cogemos&lt;br /&gt;
xs= []. Además del quickcheck, podemos hacer &amp;quot;apply (induct xs, auto)&amp;quot; &lt;br /&gt;
y ver que nos pide que demostremos False.&lt;br /&gt;
*)&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: dejo la prueba por inducción y casos*)&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (x#xs)) = estaEn a (x#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume a1:&amp;quot;estaEn x xs&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) = &lt;br /&gt;
                estaEn a (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a (x#xs)&amp;quot; using a1 by auto&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume a2:&amp;quot;¬(estaEn x xs)&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) =&lt;br /&gt;
                estaEn a (x#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (a = x ∨ estaEn a (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis using hi by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.1. Demostrar o refutar automáticamente &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: estaEn_borraDuplicados)&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.2. Demostrar o refutar detalladamente&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados2 (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume hi: &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;sinDuplicados2 (borraDuplicados (x#xs)) =&lt;br /&gt;
          sinDuplicados2 ((if estaEn x xs then borraDuplicados xs &lt;br /&gt;
                           else x # borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (if estaEn x xs &lt;br /&gt;
                      then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                    else sinDuplicados2 (x#borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs)&lt;br /&gt;
                   else (¬estaEn x (borraDuplicados xs) &lt;br /&gt;
                          ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                   else (¬estaEn x xs ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot;&lt;br /&gt;
                     by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
then show &amp;quot;sinDuplicados2 (borraDuplicados (x#xs))&amp;quot; &lt;br /&gt;
             using hi by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
 (*Pedrosrei: es falso, como podemos ver si cogemos [1,2,1] y evaluamos:&lt;br /&gt;
*)&lt;br /&gt;
lemma &amp;quot;borraDuplicados&amp;#039; (rev xs) = rev (borraDuplicados&amp;#039; xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,davoremar&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
borraDuplicados (rev xs) = [a⇩2, a⇩1]&lt;br /&gt;
rev (borraDuplicados xs) = [a⇩1, a⇩2]&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=145</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=145"/>
		<updated>2014-11-19T10:02:51Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R5: Cuantificadores sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
theory R5&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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 xs =  foldr (λx. op ∧ (p x)) xs True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun todos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos3 p [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos3 p (x#xs) = (if p x then (todos3 p xs) else False)&amp;quot;&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;
(* Errata. Debe ser False el caso base seguro porque si no,&lt;br /&gt;
 la función devuelve siempre True*)&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun algunos2 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos2 p xs =  foldr (λx. op ∨ (p x)) xs False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;algunos (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
value &amp;quot;algunos2 (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun algunos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos3 p [] = False&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos3 p (x#xs) = (p x ∨ todos p xs)&amp;quot;&lt;br /&gt;
(* Nota. Nos da igual que sea True o False, pero para una proposición&lt;br /&gt;
         de más a delante necesitamos que sea False*)&lt;br /&gt;
(* jeshorcob: Debe ser False y la función tiene una errata en&lt;br /&gt;
la segunda linea porque la recursión la debe hacer sobre la función &lt;br /&gt;
algunos3  en lugar de todos *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun algunos4  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos4 p [] =False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos4 p (x#xs) = (if p x then True else (algunos4 p xs))&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;
&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1&amp;quot; &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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) = &lt;br /&gt;
          ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x∧Q x∧todos P xs∧todos Q xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x∧todos P xs)∧(Q x ∧ todos Q xs))&amp;quot; by arith                  &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = &lt;br /&gt;
                  (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; (*Muy parecida a la solución anterior*)&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 x 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) (x # xs) = &lt;br /&gt;
      ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also  have &amp;quot;... = ((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ Q x ∧ todos P xs ∧ todos Q xs)&amp;quot; by simp&lt;br /&gt;
  also   have &amp;quot;... = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x # xs) = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma todo_append:&lt;br /&gt;
 &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) = (((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; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) =((todos (λx. P x ∧ Q x) [x]) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos Q [x]) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos P xs) ∧ (todos Q [x] ∧ todos Q xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp (* emimarriv: Esta linea puede suprimirse, pero la dejo porque se sigue&lt;br /&gt;
                                                                            mejor el proceso*)&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by auto&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a#x)@y) =&lt;br /&gt;
                 (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
(* es igual que la de jeshorcob pero nos podemos ahorrar &lt;br /&gt;
        una linea de comando*)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append2:&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;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* es igual que las anteriores pero salió con mayor nivel de detalle *)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append:  &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;
  also have &amp;quot;... = ((P a ∧ todos P x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... =  (todos P (a # x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; 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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
apply (induct xs)&lt;br /&gt;
apply (auto simp add: todos_append)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic&amp;quot;&lt;br /&gt;
&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;
 &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;
--&amp;quot;jeshorcob, juacorvic&amp;quot;&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 x 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 (x#xs)) = todos P ((rev xs) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [x])&amp;quot; &lt;br /&gt;
              by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [x])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P x)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ todos P xs)&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (x#xs)) = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
&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; by auto&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;
(*Pedrosrei: No sé cómo has conseguido el contraejemplo,&lt;br /&gt;
  probablemente algún fallo en los paréntesis, ya que la propiedad &lt;br /&gt;
  resulta cierta como expongo abajo:&lt;br /&gt;
*)&lt;br /&gt;
(* jeshorcob: el contraejemplo existe. Fijate en lo siguiente: *)&lt;br /&gt;
fun p1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;p1 x = (x=3)&amp;quot;&lt;br /&gt;
fun q1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;q1 x = (x=2)&amp;quot;&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2]&amp;quot; -- &amp;quot;= False &lt;br /&gt;
  (porque ningún elemento de la lista cumple a la vez p1 y q1)&amp;quot;&lt;br /&gt;
value &amp;quot;(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= True &lt;br /&gt;
  (porque cada elemento de la lista cumple una sola de p1 y q1)&amp;quot;&lt;br /&gt;
(*Por tanto:*)&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2] = &lt;br /&gt;
(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
(*Esta es una instancia del contraejemplo que encuentra QuickCheck*)&lt;br /&gt;
&lt;br /&gt;
&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 (metis (full_types) algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Al cambiar la definición de algunos para que coincida con list_ex es cierto el &lt;br /&gt;
contraejemplo de Jesús&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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) = ((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; using HI by simp&lt;br /&gt;
 (* Ya no podemos seguir más ya que no se cuemple: &lt;br /&gt;
      also have &amp;quot;... =  ((P a ∨ algunos P xs) ∧ (Q a ∨ algunos Q xs))   &lt;br /&gt;
   Tenemos que buscar un contraejemplo:&lt;br /&gt;
 *)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv, juacorvic&amp;quot;&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 {* Encuentra el contraejemplo&lt;br /&gt;
P = {a⇩1}&lt;br /&gt;
Q = {a⇩2}&lt;br /&gt;
xs = [a⇩1, a⇩2]&lt;br /&gt;
*}&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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv, juacorvic&amp;quot;&lt;br /&gt;
 &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 ∘ 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)) = ((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; 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;
(*Pedrosrei: Pongo la automática que parece se os resiste.*) &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (metis algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Si corregís la definición de algunos sería: *)&lt;br /&gt;
&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;
(*jeshorcob: Pedro, a la tuya no sé que le pasa que no me la coge bien. &lt;br /&gt;
Dejo la mía *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv&amp;quot;&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; &lt;br /&gt;
         using HI 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;
(*Igual que anterior, cambia uso de paréntesis y un paso más*)&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
lemma algunos_append:  &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 by simp&lt;br /&gt;
also have &amp;quot;... = (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)&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 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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&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;
 &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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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 xs ∨ (P a))&amp;quot; using HI using algunos_append by auto&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;emimarriv&amp;quot;&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 x 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 (x#xs)) = algunos P ((rev xs)@[x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ (P x))&amp;quot; by (auto simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ (P x))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (x#xs)) = algunos P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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;
also have &amp;quot;... =  algunos P (a # xs)&amp;quot; by simp&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;
--&amp;quot;jeshorcob&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x 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) (x # xs) = ((P x ∨ Q x) &lt;br /&gt;
          ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x ∨ Q x) ∨ (algunos P xs ∨ algunos Q xs))&amp;quot; &lt;br /&gt;
              using hi by simp&lt;br /&gt;
  also have &amp;quot;... = (P x  ∨ algunos P xs ∨ Q x ∨ algunos Q xs)&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot; algunos (λx. P x ∨ Q x) (x # xs) =&lt;br /&gt;
                  (algunos P (x # xs) ∨ algunos Q (x # 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;
(*Pedrosrei: Es falso.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo P= esVacio, xs = []. P es la propiedad de ser vacío&lt;br /&gt;
con nuestra construcción de algunos es cierto &amp;quot;algunos esVacio []&amp;quot;&lt;br /&gt;
Sin embargo, todos (λx. (¬ esVacio {})) [] es lo mismo que &lt;br /&gt;
todos _ [] = True, por lo que ¬(todos (λx. (¬ esVacio {})) []) = False,&lt;br /&gt;
siendo falsa nuestra definición. Podemos coger de todas maneras la propiedad&lt;br /&gt;
que queramos y sigue siendo falso porque &lt;br /&gt;
(algunos _ [] True) ∧ (¬(todos _ [])= False)&lt;br /&gt;
 *)&lt;br /&gt;
lemma &lt;br /&gt;
shows &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Al corregir la definición de &amp;quot;algunos&amp;quot; deja de ser cierto lo dicho y &lt;br /&gt;
correcto lo de abajo.&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: está claro que el fallo en todo era la definición esa*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&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;
&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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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;
  finally show &amp;quot;algunos P (a # xs) =(¬ todos (λx. ¬ P x) (a#xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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;... = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; by simp &lt;br /&gt;
(* Este paso lo he puesto por inercia de otras demostraciones&lt;br /&gt;
pero realmente no veo como hacerlo más detallado *)&lt;br /&gt;
finally show  &amp;quot;algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; 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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &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) = ((x=a) ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Si cambiamos el orden de la igualdad no tenemos que&lt;br /&gt;
utilizar auto en la demostración*)&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;
&lt;br /&gt;
value &amp;quot;estaEn (2::nat) [3,2,4]&amp;quot; --&amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;estaEn (1::nat) [3,2,4]&amp;quot; --&amp;quot;= 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;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&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;estaEn y (x#xs) = (y=x ∨ estaEn y xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (y=x ∨ algunos (λx. (x=y)) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
show &amp;quot;algunos (λx. x = y) [] = estaEn y []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos (λx. x = y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
have &amp;quot;algunos (λx. x = y) (a # xs) =  (a = y ∨ algunos (λx. x = y) xs)&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = (a = y ∨ estaEn y xs)&amp;quot; using HI by simp &lt;br /&gt;
also have &amp;quot;... = (estaEn y (a # xs))&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos (λx. x = y) (a # xs) = estaEn y (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (x#xs) = (estaEn x xs ∨ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: Esta definición no es correcta. Véanse:*)&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, juacorvic&amp;quot;&lt;br /&gt;
fun sinDuplicados2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados2 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;sinDuplicados2 (x#xs) = (¬(estaEn x xs) ∧ sinDuplicados2 xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun sinDuplicados3 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados3 [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados3 (x#xs) = (if estaEn x xs then False else sinDuplicados3 xs )&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
 &lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot; &lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (x#xs) = (if estaEn x xs then borraDuplicados xs else (x#(borraDuplicados xs)))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.1. Demostrar o refutar automáticamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot; &lt;br /&gt;
lemma &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.2. Demostrar o refutar detalladamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a#xs))≤length (a#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 1+ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1+ length xs&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*Igual pero con 1 paso más*)&lt;br /&gt;
lemma length_borraDuplicados: &lt;br /&gt;
   &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs &lt;br /&gt;
  assume HI: &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1 + length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1 + length xs&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
(*Nota: así conseguimos demostrar el caso de que el elemento &amp;#039;a&amp;#039; no esté repetido&lt;br /&gt;
en la lista. Que pasa con la demostración para el caso de una lista cuyos los elementos &lt;br /&gt;
sean todos duplicados. Por ejemplo [1::1,1,1,1,1,1].&lt;br /&gt;
Esto no se reduce:&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a # xs)) ≤ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.1. Demostrar o refutar automáticamente &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic&amp;quot; &lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
apply (induct xs, auto)&lt;br /&gt;
done&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.2. Demostrar o refutar detalladamente&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: con esta definición de borraDuplicados es falso si cogemos&lt;br /&gt;
xs= []. Además del quickcheck, podemos hacer &amp;quot;apply (induct xs, auto)&amp;quot; &lt;br /&gt;
y ver que nos pide que demostremos False.&lt;br /&gt;
*)&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: dejo la prueba por inducción y casos*)&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (x#xs)) = estaEn a (x#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume a1:&amp;quot;estaEn x xs&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) = &lt;br /&gt;
                estaEn a (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a (x#xs)&amp;quot; using a1 by auto&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume a2:&amp;quot;¬(estaEn x xs)&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) =&lt;br /&gt;
                estaEn a (x#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (a = x ∨ estaEn a (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis using hi by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.1. Demostrar o refutar automáticamente &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: estaEn_borraDuplicados)&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.2. Demostrar o refutar detalladamente&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados2 (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume hi: &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;sinDuplicados2 (borraDuplicados (x#xs)) =&lt;br /&gt;
          sinDuplicados2 ((if estaEn x xs then borraDuplicados xs &lt;br /&gt;
                           else x # borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (if estaEn x xs &lt;br /&gt;
                      then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                    else sinDuplicados2 (x#borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs)&lt;br /&gt;
                   else (¬estaEn x (borraDuplicados xs) &lt;br /&gt;
                          ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                   else (¬estaEn x xs ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot;&lt;br /&gt;
                     by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
then show &amp;quot;sinDuplicados2 (borraDuplicados (x#xs))&amp;quot; &lt;br /&gt;
             using hi by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
 (*Pedrosrei: es falso, como podemos ver si cogemos [1,2,1] y evaluamos:&lt;br /&gt;
*)&lt;br /&gt;
lemma &amp;quot;borraDuplicados&amp;#039; (rev xs) = rev (borraDuplicados&amp;#039; xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
borraDuplicados (rev xs) = [a⇩2, a⇩1]&lt;br /&gt;
rev (borraDuplicados xs) = [a⇩1, a⇩2]&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=144</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=144"/>
		<updated>2014-11-19T10:00:50Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R5: Cuantificadores sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
theory R5&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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 xs =  foldr (λx. op ∧ (p x)) xs True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun todos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos3 p [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos3 p (x#xs) = (if p x then (todos3 p xs) else False)&amp;quot;&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;
(* Errata. Debe ser False el caso base seguro porque si no,&lt;br /&gt;
 la función devuelve siempre True*)&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun algunos2 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos2 p xs =  foldr (λx. op ∨ (p x)) xs False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;algunos (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
value &amp;quot;algunos2 (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun algunos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos3 p [] = False&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos3 p (x#xs) = (p x ∨ todos p xs)&amp;quot;&lt;br /&gt;
(* Nota. Nos da igual que sea True o False, pero para una proposición&lt;br /&gt;
         de más a delante necesitamos que sea False*)&lt;br /&gt;
(* jeshorcob: Debe ser False y la función tiene una errata en&lt;br /&gt;
la segunda linea porque la recursión la debe hacer sobre la función &lt;br /&gt;
algunos3  en lugar de todos *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun algunos4  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos4 p [] =False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos4 p (x#xs) = (if p x then True else (algunos4 p xs))&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;
&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1&amp;quot; &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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) = &lt;br /&gt;
          ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x∧Q x∧todos P xs∧todos Q xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x∧todos P xs)∧(Q x ∧ todos Q xs))&amp;quot; by arith                  &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = &lt;br /&gt;
                  (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; (*Muy parecida a la solución anterior*)&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 x 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) (x # xs) = &lt;br /&gt;
      ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also  have &amp;quot;... = ((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ Q x ∧ todos P xs ∧ todos Q xs)&amp;quot; by simp&lt;br /&gt;
  also   have &amp;quot;... = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x # xs) = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma todo_append:&lt;br /&gt;
 &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) = (((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; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) =((todos (λx. P x ∧ Q x) [x]) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos Q [x]) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos P xs) ∧ (todos Q [x] ∧ todos Q xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp (* emimarriv: Esta linea puede suprimirse, pero la dejo porque se sigue&lt;br /&gt;
                                                                            mejor el proceso*)&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by auto&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a#x)@y) =&lt;br /&gt;
                 (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
(* es igual que la de jeshorcob pero nos podemos ahorrar &lt;br /&gt;
        una linea de comando*)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append2:&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;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* es igual que las anteriores pero salió con mayor nivel de detalle *)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append:  &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;
  also have &amp;quot;... = ((P a ∧ todos P x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... =  (todos P (a # x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; 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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
apply (induct xs)&lt;br /&gt;
apply (auto simp add: todos_append)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic&amp;quot;&lt;br /&gt;
&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;
 &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;
--&amp;quot;jeshorcob, juacorvic&amp;quot;&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 x 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 (x#xs)) = todos P ((rev xs) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [x])&amp;quot; &lt;br /&gt;
              by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [x])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P x)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ todos P xs)&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (x#xs)) = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
&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; by auto&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;
(*Pedrosrei: No sé cómo has conseguido el contraejemplo,&lt;br /&gt;
  probablemente algún fallo en los paréntesis, ya que la propiedad &lt;br /&gt;
  resulta cierta como expongo abajo:&lt;br /&gt;
*)&lt;br /&gt;
(* jeshorcob: el contraejemplo existe. Fijate en lo siguiente: *)&lt;br /&gt;
fun p1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;p1 x = (x=3)&amp;quot;&lt;br /&gt;
fun q1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;q1 x = (x=2)&amp;quot;&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2]&amp;quot; -- &amp;quot;= False &lt;br /&gt;
  (porque ningún elemento de la lista cumple a la vez p1 y q1)&amp;quot;&lt;br /&gt;
value &amp;quot;(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= True &lt;br /&gt;
  (porque cada elemento de la lista cumple una sola de p1 y q1)&amp;quot;&lt;br /&gt;
(*Por tanto:*)&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2] = &lt;br /&gt;
(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
(*Esta es una instancia del contraejemplo que encuentra QuickCheck*)&lt;br /&gt;
&lt;br /&gt;
&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 (metis (full_types) algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Al cambiar la definición de algunos para que coincida con list_ex es cierto el &lt;br /&gt;
contraejemplo de Jesús&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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) = ((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; using HI by simp&lt;br /&gt;
 (* Ya no podemos seguir más ya que no se cuemple: &lt;br /&gt;
      also have &amp;quot;... =  ((P a ∨ algunos P xs) ∧ (Q a ∨ algunos Q xs))   &lt;br /&gt;
   Tenemos que buscar un contraejemplo:&lt;br /&gt;
 *)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv, juacorvic&amp;quot;&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 {* Encuentra el contraejemplo&lt;br /&gt;
P = {a⇩1}&lt;br /&gt;
Q = {a⇩2}&lt;br /&gt;
xs = [a⇩1, a⇩2]&lt;br /&gt;
*}&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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv, juacorvic&amp;quot;&lt;br /&gt;
 &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 ∘ 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)) = ((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; 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;
(*Pedrosrei: Pongo la automática que parece se os resiste.*) &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (metis algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Si corregís la definición de algunos sería: *)&lt;br /&gt;
&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;
(*jeshorcob: Pedro, a la tuya no sé que le pasa que no me la coge bien. &lt;br /&gt;
Dejo la mía *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv&amp;quot;&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; &lt;br /&gt;
         using HI 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;
(*Igual que anterior, cambia uso de paréntesis y un paso más*)&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
lemma algunos_append:  &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 by simp&lt;br /&gt;
also have &amp;quot;... = (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)&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 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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&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;
 &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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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 xs ∨ (P a))&amp;quot; using HI using algunos_append by auto&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;emimarriv&amp;quot;&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 x 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 (x#xs)) = algunos P ((rev xs)@[x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ (P x))&amp;quot; by (auto simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ (P x))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (x#xs)) = algunos P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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;
also have &amp;quot;... =  algunos P (a # xs)&amp;quot; by simp&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;
--&amp;quot;jeshorcob&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x 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) (x # xs) = ((P x ∨ Q x) &lt;br /&gt;
          ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x ∨ Q x) ∨ (algunos P xs ∨ algunos Q xs))&amp;quot; &lt;br /&gt;
              using hi by simp&lt;br /&gt;
  also have &amp;quot;... = (P x  ∨ algunos P xs ∨ Q x ∨ algunos Q xs)&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot; algunos (λx. P x ∨ Q x) (x # xs) =&lt;br /&gt;
                  (algunos P (x # xs) ∨ algunos Q (x # 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;
(*Pedrosrei: Es falso.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo P= esVacio, xs = []. P es la propiedad de ser vacío&lt;br /&gt;
con nuestra construcción de algunos es cierto &amp;quot;algunos esVacio []&amp;quot;&lt;br /&gt;
Sin embargo, todos (λx. (¬ esVacio {})) [] es lo mismo que &lt;br /&gt;
todos _ [] = True, por lo que ¬(todos (λx. (¬ esVacio {})) []) = False,&lt;br /&gt;
siendo falsa nuestra definición. Podemos coger de todas maneras la propiedad&lt;br /&gt;
que queramos y sigue siendo falso porque &lt;br /&gt;
(algunos _ [] True) ∧ (¬(todos _ [])= False)&lt;br /&gt;
 *)&lt;br /&gt;
lemma &lt;br /&gt;
shows &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Al corregir la definición de &amp;quot;algunos&amp;quot; deja de ser cierto lo dicho y &lt;br /&gt;
correcto lo de abajo.&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: está claro que el fallo en todo era la definición esa*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&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;
&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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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;
  finally show &amp;quot;algunos P (a # xs) =(¬ todos (λx. ¬ P x) (a#xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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;... = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; by simp &lt;br /&gt;
(* Este paso lo he puesto por inercia de otras demostraciones&lt;br /&gt;
pero realmente no veo como hacerlo más detallado *)&lt;br /&gt;
finally show  &amp;quot;algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; 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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &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) = ((x=a) ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Si cambiamos el orden de la igualdad no tenemos que&lt;br /&gt;
utilizar auto en la demostración*)&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;
&lt;br /&gt;
value &amp;quot;estaEn (2::nat) [3,2,4]&amp;quot; --&amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;estaEn (1::nat) [3,2,4]&amp;quot; --&amp;quot;= 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;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&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;estaEn y (x#xs) = (y=x ∨ estaEn y xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (y=x ∨ algunos (λx. (x=y)) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
show &amp;quot;algunos (λx. x = y) [] = estaEn y []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos (λx. x = y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
have &amp;quot;algunos (λx. x = y) (a # xs) =  (a = y ∨ algunos (λx. x = y) xs)&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = (a = y ∨ estaEn y xs)&amp;quot; using HI by simp &lt;br /&gt;
also have &amp;quot;... = (estaEn y (a # xs))&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos (λx. x = y) (a # xs) = estaEn y (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (x#xs) = (estaEn x xs ∨ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: Esta definición no es correcta. Véanse:*)&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, juacorvic&amp;quot;&lt;br /&gt;
fun sinDuplicados2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados2 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;sinDuplicados2 (x#xs) = (¬(estaEn x xs) ∧ sinDuplicados2 xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun sinDuplicados3 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados3 [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados3 (x#xs) = (if estaEn x xs then False else sinDuplicados3 xs )&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
 &lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot; &lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (x#xs) = (if estaEn x xs then borraDuplicados xs else (x#(borraDuplicados xs)))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.1. Demostrar o refutar automáticamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot; &lt;br /&gt;
lemma &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.2. Demostrar o refutar detalladamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a#xs))≤length (a#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 1+ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1+ length xs&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
(*Igual pero con n paso más*)&lt;br /&gt;
lemma length_borraDuplicados: &lt;br /&gt;
   &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs &lt;br /&gt;
  assume HI: &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1 + length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1 + length xs&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
(*Nota: así conseguimos demostrar el caso de que el elemento &amp;#039;a&amp;#039; no esté repetido&lt;br /&gt;
en la lista. Que pasa con la demostración para el caso de una lista cuyos los elementos &lt;br /&gt;
sean todos duplicados. Por ejemplo [1::1,1,1,1,1,1].&lt;br /&gt;
Esto no se reduce:&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a # xs)) ≤ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.1. Demostrar o refutar automáticamente &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic&amp;quot; &lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
apply (induct xs, auto)&lt;br /&gt;
done&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.2. Demostrar o refutar detalladamente&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: con esta definición de borraDuplicados es falso si cogemos&lt;br /&gt;
xs= []. Además del quickcheck, podemos hacer &amp;quot;apply (induct xs, auto)&amp;quot; &lt;br /&gt;
y ver que nos pide que demostremos False.&lt;br /&gt;
*)&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: dejo la prueba por inducción y casos*)&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (x#xs)) = estaEn a (x#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume a1:&amp;quot;estaEn x xs&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) = &lt;br /&gt;
                estaEn a (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a (x#xs)&amp;quot; using a1 by auto&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume a2:&amp;quot;¬(estaEn x xs)&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) =&lt;br /&gt;
                estaEn a (x#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (a = x ∨ estaEn a (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis using hi by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.1. Demostrar o refutar automáticamente &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: estaEn_borraDuplicados)&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.2. Demostrar o refutar detalladamente&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados2 (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume hi: &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;sinDuplicados2 (borraDuplicados (x#xs)) =&lt;br /&gt;
          sinDuplicados2 ((if estaEn x xs then borraDuplicados xs &lt;br /&gt;
                           else x # borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (if estaEn x xs &lt;br /&gt;
                      then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                    else sinDuplicados2 (x#borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs)&lt;br /&gt;
                   else (¬estaEn x (borraDuplicados xs) &lt;br /&gt;
                          ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                   else (¬estaEn x xs ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot;&lt;br /&gt;
                     by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
then show &amp;quot;sinDuplicados2 (borraDuplicados (x#xs))&amp;quot; &lt;br /&gt;
             using hi by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
 (*Pedrosrei: es falso, como podemos ver si cogemos [1,2,1] y evaluamos:&lt;br /&gt;
*)&lt;br /&gt;
lemma &amp;quot;borraDuplicados&amp;#039; (rev xs) = rev (borraDuplicados&amp;#039; xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
borraDuplicados (rev xs) = [a⇩2, a⇩1]&lt;br /&gt;
rev (borraDuplicados xs) = [a⇩1, a⇩2]&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=143</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=143"/>
		<updated>2014-11-19T09:22:11Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R5: Cuantificadores sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
theory R5&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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 xs =  foldr (λx. op ∧ (p x)) xs True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun todos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos3 p [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos3 p (x#xs) = (if p x then (todos3 p xs) else False)&amp;quot;&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;
(* Errata. Debe ser False el caso base seguro porque si no,&lt;br /&gt;
 la función devuelve siempre True*)&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun algunos2 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos2 p xs =  foldr (λx. op ∨ (p x)) xs False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;algunos (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
value &amp;quot;algunos2 (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun algunos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos3 p [] = False&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos3 p (x#xs) = (p x ∨ todos p xs)&amp;quot;&lt;br /&gt;
(* Nota. Nos da igual que sea True o False, pero para una proposición&lt;br /&gt;
         de más a delante necesitamos que sea False*)&lt;br /&gt;
(* jeshorcob: Debe ser False y la función tiene una errata en&lt;br /&gt;
la segunda linea porque la recursión la debe hacer sobre la función &lt;br /&gt;
algunos3  en lugar de todos *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun algunos4  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos4 p [] =False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos4 p (x#xs) = (if p x then True else (algunos4 p xs))&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;
&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1&amp;quot; &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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) = &lt;br /&gt;
          ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x∧Q x∧todos P xs∧todos Q xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x∧todos P xs)∧(Q x ∧ todos Q xs))&amp;quot; by arith                  &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = &lt;br /&gt;
                  (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; (*Muy parecida a la solución anterior*)&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 x 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) (x # xs) = &lt;br /&gt;
      ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also  have &amp;quot;... = ((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ Q x ∧ todos P xs ∧ todos Q xs)&amp;quot; by simp&lt;br /&gt;
  also   have &amp;quot;... = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x # xs) = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma todo_append:&lt;br /&gt;
 &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) = (((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; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) =((todos (λx. P x ∧ Q x) [x]) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos Q [x]) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos P xs) ∧ (todos Q [x] ∧ todos Q xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp (* emimarriv: Esta linea puede suprimirse, pero la dejo porque se sigue&lt;br /&gt;
                                                                            mejor el proceso*)&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by auto&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a#x)@y) =&lt;br /&gt;
                 (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
(* es igual que la de jeshorcob pero nos podemos ahorrar &lt;br /&gt;
        una linea de comando*)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append2:&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;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* es igual que las anteriores pero salió con mayor nivel de detalle *)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append:  &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;
  also have &amp;quot;... = ((P a ∧ todos P x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... =  (todos P (a # x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; 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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
apply (induct xs)&lt;br /&gt;
apply (auto simp add: todos_append)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic&amp;quot;&lt;br /&gt;
&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;
 &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;
--&amp;quot;jeshorcob, juacorvic&amp;quot;&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 x 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 (x#xs)) = todos P ((rev xs) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [x])&amp;quot; &lt;br /&gt;
              by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [x])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P x)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ todos P xs)&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (x#xs)) = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
&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; by auto&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;
(*Pedrosrei: No sé cómo has conseguido el contraejemplo,&lt;br /&gt;
  probablemente algún fallo en los paréntesis, ya que la propiedad &lt;br /&gt;
  resulta cierta como expongo abajo:&lt;br /&gt;
*)&lt;br /&gt;
(* jeshorcob: el contraejemplo existe. Fijate en lo siguiente: *)&lt;br /&gt;
fun p1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;p1 x = (x=3)&amp;quot;&lt;br /&gt;
fun q1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;q1 x = (x=2)&amp;quot;&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2]&amp;quot; -- &amp;quot;= False &lt;br /&gt;
  (porque ningún elemento de la lista cumple a la vez p1 y q1)&amp;quot;&lt;br /&gt;
value &amp;quot;(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= True &lt;br /&gt;
  (porque cada elemento de la lista cumple una sola de p1 y q1)&amp;quot;&lt;br /&gt;
(*Por tanto:*)&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2] = &lt;br /&gt;
(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
(*Esta es una instancia del contraejemplo que encuentra QuickCheck*)&lt;br /&gt;
&lt;br /&gt;
&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 (metis (full_types) algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Al cambiar la definición de algunos para que coincida con list_ex es cierto el &lt;br /&gt;
contraejemplo de Jesús&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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) = ((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; using HI by simp&lt;br /&gt;
 (* Ya no podemos seguir más ya que no se cuemple: &lt;br /&gt;
      also have &amp;quot;... =  ((P a ∨ algunos P xs) ∧ (Q a ∨ algunos Q xs))   &lt;br /&gt;
   Tenemos que buscar un contraejemplo:&lt;br /&gt;
 *)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv, juacorvic&amp;quot;&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 {* Encuentra el contraejemplo&lt;br /&gt;
P = {a⇩1}&lt;br /&gt;
Q = {a⇩2}&lt;br /&gt;
xs = [a⇩1, a⇩2]&lt;br /&gt;
*}&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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv, juacorvic&amp;quot;&lt;br /&gt;
 &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 ∘ 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)) = ((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; 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;
(*Pedrosrei: Pongo la automática que parece se os resiste.*) &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (metis algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Si corregís la definición de algunos sería: *)&lt;br /&gt;
&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;
(*jeshorcob: Pedro, a la tuya no sé que le pasa que no me la coge bien. &lt;br /&gt;
Dejo la mía *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv&amp;quot;&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; &lt;br /&gt;
         using HI 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;
(*Igual que anterior, cambia uso de paréntesis y un paso más*)&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
lemma algunos_append:  &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 by simp&lt;br /&gt;
also have &amp;quot;... = (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)&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 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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&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;
 &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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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 xs ∨ (P a))&amp;quot; using HI using algunos_append by auto&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;emimarriv&amp;quot;&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 x 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 (x#xs)) = algunos P ((rev xs)@[x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ (P x))&amp;quot; by (auto simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ (P x))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (x#xs)) = algunos P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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;
also have &amp;quot;... =  algunos P (a # xs)&amp;quot; by simp&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;
--&amp;quot;jeshorcob&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x 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) (x # xs) = ((P x ∨ Q x) &lt;br /&gt;
          ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x ∨ Q x) ∨ (algunos P xs ∨ algunos Q xs))&amp;quot; &lt;br /&gt;
              using hi by simp&lt;br /&gt;
  also have &amp;quot;... = (P x  ∨ algunos P xs ∨ Q x ∨ algunos Q xs)&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot; algunos (λx. P x ∨ Q x) (x # xs) =&lt;br /&gt;
                  (algunos P (x # xs) ∨ algunos Q (x # 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;
(*Pedrosrei: Es falso.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo P= esVacio, xs = []. P es la propiedad de ser vacío&lt;br /&gt;
con nuestra construcción de algunos es cierto &amp;quot;algunos esVacio []&amp;quot;&lt;br /&gt;
Sin embargo, todos (λx. (¬ esVacio {})) [] es lo mismo que &lt;br /&gt;
todos _ [] = True, por lo que ¬(todos (λx. (¬ esVacio {})) []) = False,&lt;br /&gt;
siendo falsa nuestra definición. Podemos coger de todas maneras la propiedad&lt;br /&gt;
que queramos y sigue siendo falso porque &lt;br /&gt;
(algunos _ [] True) ∧ (¬(todos _ [])= False)&lt;br /&gt;
 *)&lt;br /&gt;
lemma &lt;br /&gt;
shows &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Al corregir la definición de &amp;quot;algunos&amp;quot; deja de ser cierto lo dicho y &lt;br /&gt;
correcto lo de abajo.&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: está claro que el fallo en todo era la definición esa*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&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;
&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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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;
  finally show &amp;quot;algunos P (a # xs) =(¬ todos (λx. ¬ P x) (a#xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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;... = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; by simp &lt;br /&gt;
(* Este paso lo he puesto por inercia de otras demostraciones&lt;br /&gt;
pero realmente no veo como hacerlo más detallado *)&lt;br /&gt;
finally show  &amp;quot;algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; 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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &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) = ((x=a) ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Si cambiamos el orden de la igualdad no tenemos que&lt;br /&gt;
utilizar auto en la demostración*)&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;
&lt;br /&gt;
value &amp;quot;estaEn (2::nat) [3,2,4]&amp;quot; --&amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;estaEn (1::nat) [3,2,4]&amp;quot; --&amp;quot;= 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;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&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;estaEn y (x#xs) = (y=x ∨ estaEn y xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (y=x ∨ algunos (λx. (x=y)) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
show &amp;quot;algunos (λx. x = y) [] = estaEn y []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos (λx. x = y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
have &amp;quot;algunos (λx. x = y) (a # xs) =  (a = y ∨ algunos (λx. x = y) xs)&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = (a = y ∨ estaEn y xs)&amp;quot; using HI by simp &lt;br /&gt;
also have &amp;quot;... = (estaEn y (a # xs))&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos (λx. x = y) (a # xs) = estaEn y (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (x#xs) = (estaEn x xs ∨ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: Esta definición no es correcta. Véanse:*)&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, juacorvic&amp;quot;&lt;br /&gt;
fun sinDuplicados2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados2 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;sinDuplicados2 (x#xs) = (¬(estaEn x xs) ∧ sinDuplicados2 xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun sinDuplicados3 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados3 [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados3 (x#xs) = (if estaEn x xs then False else sinDuplicados3 xs )&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
 &lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot; &lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (x#xs) = (if estaEn x xs then borraDuplicados xs else (x#(borraDuplicados xs)))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.1. Demostrar o refutar automáticamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
lemma &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.2. Demostrar o refutar detalladamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a#xs))≤length (a#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 1+ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1+ length xs&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.1. Demostrar o refutar automáticamente &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot; &lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
apply (induct xs, auto)&lt;br /&gt;
done&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.2. Demostrar o refutar detalladamente&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: con esta definición de borraDuplicados es falso si cogemos&lt;br /&gt;
xs= []. Además del quickcheck, podemos hacer &amp;quot;apply (induct xs, auto)&amp;quot; &lt;br /&gt;
y ver que nos pide que demostremos False.&lt;br /&gt;
*)&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: dejo la prueba por inducción y casos*)&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (x#xs)) = estaEn a (x#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume a1:&amp;quot;estaEn x xs&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) = &lt;br /&gt;
                estaEn a (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a (x#xs)&amp;quot; using a1 by auto&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume a2:&amp;quot;¬(estaEn x xs)&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) =&lt;br /&gt;
                estaEn a (x#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (a = x ∨ estaEn a (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis using hi by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.1. Demostrar o refutar automáticamente &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: estaEn_borraDuplicados)&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.2. Demostrar o refutar detalladamente&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados2 (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume hi: &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;sinDuplicados2 (borraDuplicados (x#xs)) =&lt;br /&gt;
          sinDuplicados2 ((if estaEn x xs then borraDuplicados xs &lt;br /&gt;
                           else x # borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (if estaEn x xs &lt;br /&gt;
                      then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                    else sinDuplicados2 (x#borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs)&lt;br /&gt;
                   else (¬estaEn x (borraDuplicados xs) &lt;br /&gt;
                          ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                   else (¬estaEn x xs ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot;&lt;br /&gt;
                     by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
then show &amp;quot;sinDuplicados2 (borraDuplicados (x#xs))&amp;quot; &lt;br /&gt;
             using hi by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
 (*Pedrosrei: es falso, como podemos ver si cogemos [1,2,1] y evaluamos:&lt;br /&gt;
*)&lt;br /&gt;
lemma &amp;quot;borraDuplicados&amp;#039; (rev xs) = rev (borraDuplicados&amp;#039; xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
borraDuplicados (rev xs) = [a⇩2, a⇩1]&lt;br /&gt;
rev (borraDuplicados xs) = [a⇩1, a⇩2]&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=142</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=142"/>
		<updated>2014-11-19T09:01:16Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R5: Cuantificadores sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
theory R5&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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 xs =  foldr (λx. op ∧ (p x)) xs True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun todos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos3 p [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos3 p (x#xs) = (if p x then (todos3 p xs) else False)&amp;quot;&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;
(* Errata. Debe ser False el caso base seguro porque si no,&lt;br /&gt;
 la función devuelve siempre True*)&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun algunos2 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos2 p xs =  foldr (λx. op ∨ (p x)) xs False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;algunos (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
value &amp;quot;algunos2 (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun algunos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos3 p [] = False&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos3 p (x#xs) = (p x ∨ todos p xs)&amp;quot;&lt;br /&gt;
(* Nota. Nos da igual que sea True o False, pero para una proposición&lt;br /&gt;
         de más a delante necesitamos que sea False*)&lt;br /&gt;
(* jeshorcob: Debe ser False y la función tiene una errata en&lt;br /&gt;
la segunda linea porque la recursión la debe hacer sobre la función &lt;br /&gt;
algunos3  en lugar de todos *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun algunos4  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos4 p [] =False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos4 p (x#xs) = (if p x then True else (algunos4 p xs))&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;
&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1&amp;quot; &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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) = &lt;br /&gt;
          ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x∧Q x∧todos P xs∧todos Q xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x∧todos P xs)∧(Q x ∧ todos Q xs))&amp;quot; by arith                  &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = &lt;br /&gt;
                  (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; (*Muy parecida a la solución anterior*)&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 x 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) (x # xs) = &lt;br /&gt;
      ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also  have &amp;quot;... = ((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ Q x ∧ todos P xs ∧ todos Q xs)&amp;quot; by simp&lt;br /&gt;
  also   have &amp;quot;... = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x # xs) = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma todo_append:&lt;br /&gt;
 &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) = (((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; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) =((todos (λx. P x ∧ Q x) [x]) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos Q [x]) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos P xs) ∧ (todos Q [x] ∧ todos Q xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp (* emimarriv: Esta linea puede suprimirse, pero la dejo porque se sigue&lt;br /&gt;
                                                                            mejor el proceso*)&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by auto&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a#x)@y) =&lt;br /&gt;
                 (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
(* es igual que la de jeshorcob pero nos podemos ahorrar &lt;br /&gt;
        una linea de comando*)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append2:&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;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* es igual que las anteriores pero salió con mayor nivel de detalle *)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append:  &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;
  also have &amp;quot;... = ((P a ∧ todos P x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... =  (todos P (a # x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; 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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
apply (induct xs)&lt;br /&gt;
apply (auto simp add: todos_append)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic&amp;quot;&lt;br /&gt;
&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;
 &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;
--&amp;quot;jeshorcob, juacorvic&amp;quot;&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 x 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 (x#xs)) = todos P ((rev xs) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [x])&amp;quot; &lt;br /&gt;
              by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [x])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P x)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ todos P xs)&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (x#xs)) = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
&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; by auto&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;
(*Pedrosrei: No sé cómo has conseguido el contraejemplo,&lt;br /&gt;
  probablemente algún fallo en los paréntesis, ya que la propiedad &lt;br /&gt;
  resulta cierta como expongo abajo:&lt;br /&gt;
*)&lt;br /&gt;
(* jeshorcob: el contraejemplo existe. Fijate en lo siguiente: *)&lt;br /&gt;
fun p1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;p1 x = (x=3)&amp;quot;&lt;br /&gt;
fun q1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;q1 x = (x=2)&amp;quot;&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2]&amp;quot; -- &amp;quot;= False &lt;br /&gt;
  (porque ningún elemento de la lista cumple a la vez p1 y q1)&amp;quot;&lt;br /&gt;
value &amp;quot;(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= True &lt;br /&gt;
  (porque cada elemento de la lista cumple una sola de p1 y q1)&amp;quot;&lt;br /&gt;
(*Por tanto:*)&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2] = &lt;br /&gt;
(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
(*Esta es una instancia del contraejemplo que encuentra QuickCheck*)&lt;br /&gt;
&lt;br /&gt;
&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 (metis (full_types) algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Al cambiar la definición de algunos para que coincida con list_ex es cierto el &lt;br /&gt;
contraejemplo de Jesús&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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) = ((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; using HI by simp&lt;br /&gt;
 (* Ya no podemos seguir más ya que no se cuemple: &lt;br /&gt;
      also have &amp;quot;... =  ((P a ∨ algunos P xs) ∧ (Q a ∨ algunos Q xs))   &lt;br /&gt;
   Tenemos que buscar un contraejemplo:&lt;br /&gt;
 *)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv, juacorvic&amp;quot;&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 {* Encuentra el contraejemplo&lt;br /&gt;
P = {a⇩1}&lt;br /&gt;
Q = {a⇩2}&lt;br /&gt;
xs = [a⇩1, a⇩2]&lt;br /&gt;
*}&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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv, juacorvic&amp;quot;&lt;br /&gt;
 &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 ∘ 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)) = ((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; 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;
(*Pedrosrei: Pongo la automática que parece se os resiste.*) &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (metis algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Si corregís la definición de algunos sería: *)&lt;br /&gt;
&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;
(*jeshorcob: Pedro, a la tuya no sé que le pasa que no me la coge bien. &lt;br /&gt;
Dejo la mía *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv&amp;quot;&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; &lt;br /&gt;
         using HI 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;
(*Igual que anterior, cambia uso de paréntesis y un paso más*)&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
lemma algunos_append:  &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 by simp&lt;br /&gt;
also have &amp;quot;... = (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)&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 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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&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;
 &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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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 xs ∨ (P a))&amp;quot; using HI using algunos_append by auto&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;emimarriv&amp;quot;&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 x 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 (x#xs)) = algunos P ((rev xs)@[x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ (P x))&amp;quot; by (auto simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ (P x))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (x#xs)) = algunos P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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;
also have &amp;quot;... =  algunos P (a # xs)&amp;quot; by simp&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;
--&amp;quot;jeshorcob&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x 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) (x # xs) = ((P x ∨ Q x) &lt;br /&gt;
          ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x ∨ Q x) ∨ (algunos P xs ∨ algunos Q xs))&amp;quot; &lt;br /&gt;
              using hi by simp&lt;br /&gt;
  also have &amp;quot;... = (P x  ∨ algunos P xs ∨ Q x ∨ algunos Q xs)&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot; algunos (λx. P x ∨ Q x) (x # xs) =&lt;br /&gt;
                  (algunos P (x # xs) ∨ algunos Q (x # 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;
(*Pedrosrei: Es falso.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo P= esVacio, xs = []. P es la propiedad de ser vacío&lt;br /&gt;
con nuestra construcción de algunos es cierto &amp;quot;algunos esVacio []&amp;quot;&lt;br /&gt;
Sin embargo, todos (λx. (¬ esVacio {})) [] es lo mismo que &lt;br /&gt;
todos _ [] = True, por lo que ¬(todos (λx. (¬ esVacio {})) []) = False,&lt;br /&gt;
siendo falsa nuestra definición. Podemos coger de todas maneras la propiedad&lt;br /&gt;
que queramos y sigue siendo falso porque &lt;br /&gt;
(algunos _ [] True) ∧ (¬(todos _ [])= False)&lt;br /&gt;
 *)&lt;br /&gt;
lemma &lt;br /&gt;
shows &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Al corregir la definición de &amp;quot;algunos&amp;quot; deja de ser cierto lo dicho y &lt;br /&gt;
correcto lo de abajo.&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: está claro que el fallo en todo era la definición esa*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&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;
&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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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;
  finally show &amp;quot;algunos P (a # xs) =(¬ todos (λx. ¬ P x) (a#xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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;... = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; by simp &lt;br /&gt;
(* Este paso lo he puesto por inercia de otras demostraciones&lt;br /&gt;
pero realmente no veo como hacerlo más detallado *)&lt;br /&gt;
finally show  &amp;quot;algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; 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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &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) = ((x=a) ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(*Si cambiamos el orden de la igualdad no tenemos que&lt;br /&gt;
utilizar auto en la demostración*)&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;
&lt;br /&gt;
value &amp;quot;estaEn (2::nat) [3,2,4]&amp;quot; --&amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;estaEn (1::nat) [3,2,4]&amp;quot; --&amp;quot;= 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;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&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;estaEn y (x#xs) = (y=x ∨ estaEn y xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (y=x ∨ algunos (λx. (x=y)) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
show &amp;quot;algunos (λx. x = y) [] = estaEn y []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos (λx. x = y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
have &amp;quot;algunos (λx. x = y) (a # xs) =  (a = y ∨ algunos (λx. x = y) xs)&amp;quot; by simp&lt;br /&gt;
also have &amp;quot;... = (a = y ∨ estaEn y xs)&amp;quot; using HI by simp &lt;br /&gt;
also have &amp;quot;... = (estaEn y (a # xs))&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos (λx. x = y) (a # xs) = estaEn y (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (x#xs) = (estaEn x xs ∨ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: Esta definición no es correcta. Véanse:*)&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, juacorvic&amp;quot;&lt;br /&gt;
fun sinDuplicados2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados2 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;sinDuplicados2 (x#xs) = (¬(estaEn x xs) ∧ sinDuplicados2 xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun sinDuplicados3 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados3 [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados3 (x#xs) = (if estaEn x xs then False else sinDuplicados3 xs )&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
 &lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (x#xs) = (if estaEn x xs then borraDuplicados xs else (x#(borraDuplicados xs)))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.1. Demostrar o refutar automáticamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
lemma &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.2. Demostrar o refutar detalladamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a#xs))≤length (a#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 1+ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1+ length xs&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.1. Demostrar o refutar automáticamente &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot; &lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
apply (induct xs, auto)&lt;br /&gt;
done&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.2. Demostrar o refutar detalladamente&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: con esta definición de borraDuplicados es falso si cogemos&lt;br /&gt;
xs= []. Además del quickcheck, podemos hacer &amp;quot;apply (induct xs, auto)&amp;quot; &lt;br /&gt;
y ver que nos pide que demostremos False.&lt;br /&gt;
*)&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: dejo la prueba por inducción y casos*)&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (x#xs)) = estaEn a (x#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume a1:&amp;quot;estaEn x xs&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) = &lt;br /&gt;
                estaEn a (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a (x#xs)&amp;quot; using a1 by auto&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume a2:&amp;quot;¬(estaEn x xs)&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) =&lt;br /&gt;
                estaEn a (x#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (a = x ∨ estaEn a (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis using hi by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.1. Demostrar o refutar automáticamente &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: estaEn_borraDuplicados)&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.2. Demostrar o refutar detalladamente&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados2 (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume hi: &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;sinDuplicados2 (borraDuplicados (x#xs)) =&lt;br /&gt;
          sinDuplicados2 ((if estaEn x xs then borraDuplicados xs &lt;br /&gt;
                           else x # borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (if estaEn x xs &lt;br /&gt;
                      then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                    else sinDuplicados2 (x#borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs)&lt;br /&gt;
                   else (¬estaEn x (borraDuplicados xs) &lt;br /&gt;
                          ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                   else (¬estaEn x xs ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot;&lt;br /&gt;
                     by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
then show &amp;quot;sinDuplicados2 (borraDuplicados (x#xs))&amp;quot; &lt;br /&gt;
             using hi by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
 (*Pedrosrei: es falso, como podemos ver si cogemos [1,2,1] y evaluamos:&lt;br /&gt;
*)&lt;br /&gt;
lemma &amp;quot;borraDuplicados&amp;#039; (rev xs) = rev (borraDuplicados&amp;#039; xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
borraDuplicados (rev xs) = [a⇩2, a⇩1]&lt;br /&gt;
rev (borraDuplicados xs) = [a⇩1, a⇩2]&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=141</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=141"/>
		<updated>2014-11-18T13:42:25Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R5: Cuantificadores sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
theory R5&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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 xs =  foldr (λx. op ∧ (p x)) xs True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun todos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos3 p [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos3 p (x#xs) = (if p x then (todos3 p xs) else False)&amp;quot;&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;
(* Errata. Debe ser False el caso base seguro porque si no,&lt;br /&gt;
 la función devuelve siempre True*)&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun algunos2 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos2 p xs =  foldr (λx. op ∨ (p x)) xs False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;algunos (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
value &amp;quot;algunos2 (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun algunos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos3 p [] = False&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos3 p (x#xs) = (p x ∨ todos p xs)&amp;quot;&lt;br /&gt;
(* Nota. Nos da igual que sea True o False, pero para una proposición&lt;br /&gt;
         de más a delante necesitamos que sea False*)&lt;br /&gt;
(* jeshorcob: Debe ser False y la función tiene una errata en&lt;br /&gt;
la segunda linea porque la recursión la debe hacer sobre la función &lt;br /&gt;
algunos3  en lugar de todos *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun algunos4  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos4 p [] =False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos4 p (x#xs) = (if p x then True else (algunos4 p xs))&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;
&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1&amp;quot; &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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) = &lt;br /&gt;
          ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x∧Q x∧todos P xs∧todos Q xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x∧todos P xs)∧(Q x ∧ todos Q xs))&amp;quot; by arith                  &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = &lt;br /&gt;
                  (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; (*Muy parecida a la solución anterior*)&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 x 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) (x # xs) = &lt;br /&gt;
      ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also  have &amp;quot;... = ((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ Q x ∧ todos P xs ∧ todos Q xs)&amp;quot; by simp&lt;br /&gt;
  also   have &amp;quot;... = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x # xs) = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma todo_append:&lt;br /&gt;
 &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) = (((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; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) =((todos (λx. P x ∧ Q x) [x]) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos Q [x]) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos P xs) ∧ (todos Q [x] ∧ todos Q xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp (* emimarriv: Esta linea puede suprimirse, pero la dejo porque se sigue&lt;br /&gt;
                                                                            mejor el proceso*)&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by auto&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a#x)@y) =&lt;br /&gt;
                 (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
(* es igual que la de jeshorcob pero nos podemos ahorrar &lt;br /&gt;
        una linea de comando*)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append2:&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;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* es igual que las anteriores pero salió con mayor nivel de detalle *)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append:  &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;
  also have &amp;quot;... = ((P a ∧ todos P x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... =  (todos P (a # x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; 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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
apply (induct xs)&lt;br /&gt;
apply (auto simp add: todos_append)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic&amp;quot;&lt;br /&gt;
&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;
 &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;
--&amp;quot;jeshorcob, juacorvic&amp;quot;&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 x 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 (x#xs)) = todos P ((rev xs) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [x])&amp;quot; &lt;br /&gt;
              by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [x])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P x)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ todos P xs)&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (x#xs)) = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
&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; by auto&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;
(*Pedrosrei: No sé cómo has conseguido el contraejemplo,&lt;br /&gt;
  probablemente algún fallo en los paréntesis, ya que la propiedad &lt;br /&gt;
  resulta cierta como expongo abajo:&lt;br /&gt;
*)&lt;br /&gt;
(* jeshorcob: el contraejemplo existe. Fijate en lo siguiente: *)&lt;br /&gt;
fun p1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;p1 x = (x=3)&amp;quot;&lt;br /&gt;
fun q1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;q1 x = (x=2)&amp;quot;&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2]&amp;quot; -- &amp;quot;= False &lt;br /&gt;
  (porque ningún elemento de la lista cumple a la vez p1 y q1)&amp;quot;&lt;br /&gt;
value &amp;quot;(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= True &lt;br /&gt;
  (porque cada elemento de la lista cumple una sola de p1 y q1)&amp;quot;&lt;br /&gt;
(*Por tanto:*)&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2] = &lt;br /&gt;
(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
(*Esta es una instancia del contraejemplo que encuentra QuickCheck*)&lt;br /&gt;
&lt;br /&gt;
&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 (metis (full_types) algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Al cambiar la definición de algunos para que coincida con list_ex es cierto el &lt;br /&gt;
contraejemplo de Jesús&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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) = ((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; using HI by simp&lt;br /&gt;
 (* Ya no podemos seguir más ya que no se cuemple: &lt;br /&gt;
      also have &amp;quot;... =  ((P a ∨ algunos P xs) ∧ (Q a ∨ algunos Q xs))   &lt;br /&gt;
   Tenemos que buscar un contraejemplo:&lt;br /&gt;
 *)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv, juacorvic&amp;quot;&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 {* Encuentra el contraejemplo&lt;br /&gt;
P = {a⇩1}&lt;br /&gt;
Q = {a⇩2}&lt;br /&gt;
xs = [a⇩1, a⇩2]&lt;br /&gt;
*}&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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv, juacorvic&amp;quot;&lt;br /&gt;
 &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 ∘ 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)) = ((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; 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;
(*Pedrosrei: Pongo la automática que parece se os resiste.*) &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (metis algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Si corregís la definición de algunos sería: *)&lt;br /&gt;
&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;
(*jeshorcob: Pedro, a la tuya no sé que le pasa que no me la coge bien. &lt;br /&gt;
Dejo la mía *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv&amp;quot;&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; &lt;br /&gt;
         using HI 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;
(*Igual que anterior, cambia uso de paréntesis y un paso más*)&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
lemma algunos_append:  &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 by simp&lt;br /&gt;
also have &amp;quot;... = (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)&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 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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&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;
 &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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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 xs ∨ (P a))&amp;quot; using HI using algunos_append by auto&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;emimarriv&amp;quot;&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 x 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 (x#xs)) = algunos P ((rev xs)@[x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ (P x))&amp;quot; by (auto simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ (P x))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (x#xs)) = algunos P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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;
also have &amp;quot;... =  algunos P (a # xs)&amp;quot; by simp&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;
--&amp;quot;jeshorcob&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x 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) (x # xs) = ((P x ∨ Q x) &lt;br /&gt;
          ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x ∨ Q x) ∨ (algunos P xs ∨ algunos Q xs))&amp;quot; &lt;br /&gt;
              using hi by simp&lt;br /&gt;
  also have &amp;quot;... = (P x  ∨ algunos P xs ∨ Q x ∨ algunos Q xs)&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot; algunos (λx. P x ∨ Q x) (x # xs) =&lt;br /&gt;
                  (algunos P (x # xs) ∨ algunos Q (x # 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;
(*Pedrosrei: Es falso.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo P= esVacio, xs = []. P es la propiedad de ser vacío&lt;br /&gt;
con nuestra construcción de algunos es cierto &amp;quot;algunos esVacio []&amp;quot;&lt;br /&gt;
Sin embargo, todos (λx. (¬ esVacio {})) [] es lo mismo que &lt;br /&gt;
todos _ [] = True, por lo que ¬(todos (λx. (¬ esVacio {})) []) = False,&lt;br /&gt;
siendo falsa nuestra definición. Podemos coger de todas maneras la propiedad&lt;br /&gt;
que queramos y sigue siendo falso porque &lt;br /&gt;
(algunos _ [] True) ∧ (¬(todos _ [])= False)&lt;br /&gt;
 *)&lt;br /&gt;
lemma &lt;br /&gt;
shows &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Al corregir la definición de &amp;quot;algunos&amp;quot; deja de ser cierto lo dicho y &lt;br /&gt;
correcto lo de abajo.&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: está claro que el fallo en todo era la definición esa*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&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;
&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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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;
  finally show &amp;quot;algunos P (a # xs) =(¬ todos (λx. ¬ P x) (a#xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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;... = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; by simp &lt;br /&gt;
(* Este paso lo he puesto por inercia de otras demostraciones&lt;br /&gt;
pero realmente no veo como hacerlo más detallado *)&lt;br /&gt;
finally show  &amp;quot;algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot; 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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &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) = ((x=a) ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;estaEn (2::nat) [3,2,4]&amp;quot; --&amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;estaEn (1::nat) [3,2,4]&amp;quot; --&amp;quot;= 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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&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;estaEn y (x#xs) = (y=x ∨ estaEn y xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (y=x ∨ algunos (λx. (x=y)) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (x#xs) = (estaEn x xs ∨ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: Esta definición no es correcta. Véanse:*)&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun sinDuplicados2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados2 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;sinDuplicados2 (x#xs) = (¬(estaEn x xs) ∧ sinDuplicados2 xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun sinDuplicados3 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados3 [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados3 (x#xs) = (if estaEn x xs then False else sinDuplicados3 xs )&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
 &lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (x#xs) = (if estaEn x xs then borraDuplicados xs else (x#(borraDuplicados xs)))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.1. Demostrar o refutar automáticamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
lemma &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.2. Demostrar o refutar detalladamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a#xs))≤length (a#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 1+ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1+ length xs&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.1. Demostrar o refutar automáticamente &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot; &lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
apply (induct xs, auto)&lt;br /&gt;
done&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.2. Demostrar o refutar detalladamente&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: con esta definición de borraDuplicados es falso si cogemos&lt;br /&gt;
xs= []. Además del quickcheck, podemos hacer &amp;quot;apply (induct xs, auto)&amp;quot; &lt;br /&gt;
y ver que nos pide que demostremos False.&lt;br /&gt;
*)&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: dejo la prueba por inducción y casos*)&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (x#xs)) = estaEn a (x#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume a1:&amp;quot;estaEn x xs&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) = &lt;br /&gt;
                estaEn a (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a (x#xs)&amp;quot; using a1 by auto&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume a2:&amp;quot;¬(estaEn x xs)&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) =&lt;br /&gt;
                estaEn a (x#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (a = x ∨ estaEn a (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis using hi by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.1. Demostrar o refutar automáticamente &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: estaEn_borraDuplicados)&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.2. Demostrar o refutar detalladamente&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados2 (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume hi: &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;sinDuplicados2 (borraDuplicados (x#xs)) =&lt;br /&gt;
          sinDuplicados2 ((if estaEn x xs then borraDuplicados xs &lt;br /&gt;
                           else x # borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (if estaEn x xs &lt;br /&gt;
                      then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                    else sinDuplicados2 (x#borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs)&lt;br /&gt;
                   else (¬estaEn x (borraDuplicados xs) &lt;br /&gt;
                          ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                   else (¬estaEn x xs ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot;&lt;br /&gt;
                     by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
then show &amp;quot;sinDuplicados2 (borraDuplicados (x#xs))&amp;quot; &lt;br /&gt;
             using hi by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
 (*Pedrosrei: es falso, como podemos ver si cogemos [1,2,1] y evaluamos:&lt;br /&gt;
*)&lt;br /&gt;
lemma &amp;quot;borraDuplicados&amp;#039; (rev xs) = rev (borraDuplicados&amp;#039; xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
borraDuplicados (rev xs) = [a⇩2, a⇩1]&lt;br /&gt;
rev (borraDuplicados xs) = [a⇩1, a⇩2]&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=140</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=140"/>
		<updated>2014-11-18T09:52:14Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R5: Cuantificadores sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
theory R5&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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 xs =  foldr (λx. op ∧ (p x)) xs True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun todos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos3 p [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos3 p (x#xs) = (if p x then (todos3 p xs) else False)&amp;quot;&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;
(* Errata. Debe ser False el caso base seguro porque si no,&lt;br /&gt;
 la función devuelve siempre True*)&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun algunos2 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos2 p xs =  foldr (λx. op ∨ (p x)) xs False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;algunos (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
value &amp;quot;algunos2 (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun algunos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos3 p [] = False&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos3 p (x#xs) = (p x ∨ todos p xs)&amp;quot;&lt;br /&gt;
(* Nota. Nos da igual que sea True o False, pero para una proposición&lt;br /&gt;
         de más a delante necesitamos que sea False*)&lt;br /&gt;
(* jeshorcob: Debe ser False y la función tiene una errata en&lt;br /&gt;
la segunda linea porque la recursión la debe hacer sobre la función &lt;br /&gt;
algunos3  en lugar de todos *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun algunos4  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos4 p [] =False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos4 p (x#xs) = (if p x then True else (algunos4 p xs))&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;
&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1&amp;quot; &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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) = &lt;br /&gt;
          ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x∧Q x∧todos P xs∧todos Q xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x∧todos P xs)∧(Q x ∧ todos Q xs))&amp;quot; by arith                  &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = &lt;br /&gt;
                  (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; (*Muy parecida a la solución anterior*)&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 x 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) (x # xs) = &lt;br /&gt;
      ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also  have &amp;quot;... = ((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ Q x ∧ todos P xs ∧ todos Q xs)&amp;quot; by simp&lt;br /&gt;
  also   have &amp;quot;... = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x # xs) = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma todo_append:&lt;br /&gt;
 &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) = (((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; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) =((todos (λx. P x ∧ Q x) [x]) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos Q [x]) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos P xs) ∧ (todos Q [x] ∧ todos Q xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp (* emimarriv: Esta linea puede suprimirse, pero la dejo porque se sigue&lt;br /&gt;
                                                                            mejor el proceso*)&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by auto&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a#x)@y) =&lt;br /&gt;
                 (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
(* es igual que la de jeshorcob pero nos podemos ahorrar &lt;br /&gt;
        una linea de comando*)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append2:&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;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* es igual que las anteriores pero salió con mayor nivel de detalle *)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append:  &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;
  also have &amp;quot;... = ((P a ∧ todos P x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... =  (todos P (a # x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; 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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
apply (induct xs)&lt;br /&gt;
apply (auto simp add: todos_append)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic&amp;quot;&lt;br /&gt;
&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;
 &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;
--&amp;quot;jeshorcob, juacorvic&amp;quot;&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 x 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 (x#xs)) = todos P ((rev xs) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [x])&amp;quot; &lt;br /&gt;
              by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [x])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P x)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ todos P xs)&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (x#xs)) = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
&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; by auto&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;
(*Pedrosrei: No sé cómo has conseguido el contraejemplo,&lt;br /&gt;
  probablemente algún fallo en los paréntesis, ya que la propiedad &lt;br /&gt;
  resulta cierta como expongo abajo:&lt;br /&gt;
*)&lt;br /&gt;
(* jeshorcob: el contraejemplo existe. Fijate en lo siguiente: *)&lt;br /&gt;
fun p1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;p1 x = (x=3)&amp;quot;&lt;br /&gt;
fun q1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;q1 x = (x=2)&amp;quot;&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2]&amp;quot; -- &amp;quot;= False &lt;br /&gt;
  (porque ningún elemento de la lista cumple a la vez p1 y q1)&amp;quot;&lt;br /&gt;
value &amp;quot;(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= True &lt;br /&gt;
  (porque cada elemento de la lista cumple una sola de p1 y q1)&amp;quot;&lt;br /&gt;
(*Por tanto:*)&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2] = &lt;br /&gt;
(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
(*Esta es una instancia del contraejemplo que encuentra QuickCheck*)&lt;br /&gt;
&lt;br /&gt;
&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 (metis (full_types) algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Al cambiar la definición de algunos para que coincida con list_ex es cierto el &lt;br /&gt;
contraejemplo de Jesús&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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) = ((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; using HI by simp&lt;br /&gt;
 (* Ya no podemos seguir más ya que no se cuemple: &lt;br /&gt;
      also have &amp;quot;... =  ((P a ∨ algunos P xs) ∧ (Q a ∨ algunos Q xs))   &lt;br /&gt;
   Tenemos que buscar un contraejemplo:&lt;br /&gt;
 *)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv, juacorvic&amp;quot;&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 {* Encuentra el contraejemplo&lt;br /&gt;
P = {a⇩1}&lt;br /&gt;
Q = {a⇩2}&lt;br /&gt;
xs = [a⇩1, a⇩2]&lt;br /&gt;
*}&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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv, juacorvic&amp;quot;&lt;br /&gt;
 &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 ∘ 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)) = ((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; 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;
(*Pedrosrei: Pongo la automática que parece se os resiste.*) &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (metis algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Si corregís la definición de algunos sería: *)&lt;br /&gt;
&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;
(*jeshorcob: Pedro, a la tuya no sé que le pasa que no me la coge bien. &lt;br /&gt;
Dejo la mía *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv&amp;quot;&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; &lt;br /&gt;
         using HI 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;
(*Igual que anterior, cambia uso de paréntesis y un paso más*)&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
lemma algunos_append:  &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 by simp&lt;br /&gt;
also have &amp;quot;... = (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)&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 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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&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;
 &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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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 xs ∨ (P a))&amp;quot; using HI using algunos_append by auto&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;emimarriv&amp;quot;&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 x 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 (x#xs)) = algunos P ((rev xs)@[x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ (P x))&amp;quot; by (auto simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ (P x))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (x#xs)) = algunos P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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;
also have &amp;quot;... =  algunos P (a # xs)&amp;quot; by simp&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;
--&amp;quot;jeshorcob&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x 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) (x # xs) = ((P x ∨ Q x) &lt;br /&gt;
          ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x ∨ Q x) ∨ (algunos P xs ∨ algunos Q xs))&amp;quot; &lt;br /&gt;
              using hi by simp&lt;br /&gt;
  also have &amp;quot;... = (P x  ∨ algunos P xs ∨ Q x ∨ algunos Q xs)&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot; algunos (λx. P x ∨ Q x) (x # xs) =&lt;br /&gt;
                  (algunos P (x # xs) ∨ algunos Q (x # 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;
(*Pedrosrei: Es falso.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo P= esVacio, xs = []. P es la propiedad de ser vacío&lt;br /&gt;
con nuestra construcción de algunos es cierto &amp;quot;algunos esVacio []&amp;quot;&lt;br /&gt;
Sin embargo, todos (λx. (¬ esVacio {})) [] es lo mismo que &lt;br /&gt;
todos _ [] = True, por lo que ¬(todos (λx. (¬ esVacio {})) []) = False,&lt;br /&gt;
siendo falsa nuestra definición. Podemos coger de todas maneras la propiedad&lt;br /&gt;
que queramos y sigue siendo falso porque &lt;br /&gt;
(algunos _ [] True) ∧ (¬(todos _ [])= False)&lt;br /&gt;
 *)&lt;br /&gt;
lemma &lt;br /&gt;
shows &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Al corregir la definición de &amp;quot;algunos&amp;quot; deja de ser cierto lo dicho y &lt;br /&gt;
correcto lo de abajo.&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: está claro que el fallo en todo era la definición esa*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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;
&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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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;
  finally show &amp;quot;algunos P (a # xs) =(¬ todos (λx. ¬ P x) (a#xs))&amp;quot; by auto&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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &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) = ((x=a) ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;estaEn (2::nat) [3,2,4]&amp;quot; --&amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;estaEn (1::nat) [3,2,4]&amp;quot; --&amp;quot;= 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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&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;estaEn y (x#xs) = (y=x ∨ estaEn y xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (y=x ∨ algunos (λx. (x=y)) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (x#xs) = (estaEn x xs ∨ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: Esta definición no es correcta. Véanse:*)&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun sinDuplicados2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados2 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;sinDuplicados2 (x#xs) = (¬(estaEn x xs) ∧ sinDuplicados2 xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun sinDuplicados3 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados3 [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados3 (x#xs) = (if estaEn x xs then False else sinDuplicados3 xs )&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
 &lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (x#xs) = (if estaEn x xs then borraDuplicados xs else (x#(borraDuplicados xs)))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.1. Demostrar o refutar automáticamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
lemma &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.2. Demostrar o refutar detalladamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a#xs))≤length (a#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 1+ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1+ length xs&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.1. Demostrar o refutar automáticamente &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot; &lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
apply (induct xs, auto)&lt;br /&gt;
done&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.2. Demostrar o refutar detalladamente&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: con esta definición de borraDuplicados es falso si cogemos&lt;br /&gt;
xs= []. Además del quickcheck, podemos hacer &amp;quot;apply (induct xs, auto)&amp;quot; &lt;br /&gt;
y ver que nos pide que demostremos False.&lt;br /&gt;
*)&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: dejo la prueba por inducción y casos*)&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (x#xs)) = estaEn a (x#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume a1:&amp;quot;estaEn x xs&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) = &lt;br /&gt;
                estaEn a (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a (x#xs)&amp;quot; using a1 by auto&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume a2:&amp;quot;¬(estaEn x xs)&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) =&lt;br /&gt;
                estaEn a (x#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (a = x ∨ estaEn a (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis using hi by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.1. Demostrar o refutar automáticamente &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: estaEn_borraDuplicados)&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.2. Demostrar o refutar detalladamente&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados2 (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume hi: &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;sinDuplicados2 (borraDuplicados (x#xs)) =&lt;br /&gt;
          sinDuplicados2 ((if estaEn x xs then borraDuplicados xs &lt;br /&gt;
                           else x # borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (if estaEn x xs &lt;br /&gt;
                      then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                    else sinDuplicados2 (x#borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs)&lt;br /&gt;
                   else (¬estaEn x (borraDuplicados xs) &lt;br /&gt;
                          ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                   else (¬estaEn x xs ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot;&lt;br /&gt;
                     by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
then show &amp;quot;sinDuplicados2 (borraDuplicados (x#xs))&amp;quot; &lt;br /&gt;
             using hi by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
 (*Pedrosrei: es falso, como podemos ver si cogemos [1,2,1] y evaluamos:&lt;br /&gt;
*)&lt;br /&gt;
lemma &amp;quot;borraDuplicados&amp;#039; (rev xs) = rev (borraDuplicados&amp;#039; xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
borraDuplicados (rev xs) = [a⇩2, a⇩1]&lt;br /&gt;
rev (borraDuplicados xs) = [a⇩1, a⇩2]&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=139</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=139"/>
		<updated>2014-11-18T09:31:10Z</updated>

		<summary type="html">&lt;p&gt;Juacorvic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R5: Cuantificadores sobre listas *}&lt;br /&gt;
 &lt;br /&gt;
theory R5&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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 xs =  foldr (λx. op ∧ (p x)) xs True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun todos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos3 p [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos3 p (x#xs) = (if p x then (todos3 p xs) else False)&amp;quot;&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;
(* Errata. Debe ser False el caso base seguro porque si no,&lt;br /&gt;
 la función devuelve siempre True*)&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun algunos2 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos2 p xs =  foldr (λx. op ∨ (p x)) xs False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;algunos (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
value &amp;quot;algunos2 (λx. x&amp;gt;10) [3::int,2]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun algunos3 :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos3 p [] = False&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos3 p (x#xs) = (p x ∨ todos p xs)&amp;quot;&lt;br /&gt;
(* Nota. Nos da igual que sea True o False, pero para una proposición&lt;br /&gt;
         de más a delante necesitamos que sea False*)&lt;br /&gt;
(* jeshorcob: Debe ser False y la función tiene una errata en&lt;br /&gt;
la segunda linea porque la recursión la debe hacer sobre la función &lt;br /&gt;
algunos3  en lugar de todos *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun algunos4  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos4 p [] =False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos4 p (x#xs) = (if p x then True else (algunos4 p xs))&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;
&lt;br /&gt;
--&amp;quot;jeshorcob,javrodviv1&amp;quot; &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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) = &lt;br /&gt;
          ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x∧Q x∧todos P xs∧todos Q xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x∧todos P xs)∧(Q x ∧ todos Q xs))&amp;quot; by arith                  &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = &lt;br /&gt;
                  (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; (*Muy parecida a la solución anterior*)&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 x 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) (x # xs) = &lt;br /&gt;
      ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also  have &amp;quot;... = ((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ Q x ∧ todos P xs ∧ todos Q xs)&amp;quot; by simp&lt;br /&gt;
  also   have &amp;quot;... = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x # xs) = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma todo_append:&lt;br /&gt;
 &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) = (((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; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
&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 x 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) (x#xs) =((todos (λx. P x ∧ Q x) [x]) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos Q [x]) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((todos P [x] ∧ todos P xs) ∧ (todos Q [x] ∧ todos Q xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by simp (* emimarriv: Esta linea puede suprimirse, pero la dejo porque se sigue&lt;br /&gt;
                                                                            mejor el proceso*)&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (x#xs) = (todos P (x#xs) ∧ todos Q (x#xs))&amp;quot; by auto&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;
--&amp;quot;jeshorcob,javrodviv1,juacorvic&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a#x)@y) =&lt;br /&gt;
                 (todos P (a#x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
(* es igual que la de jeshorcob pero nos podemos ahorrar &lt;br /&gt;
        una linea de comando*)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append2:&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;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
(* es igual que las anteriores pero salió con mayor nivel de detalle *)&lt;br /&gt;
&lt;br /&gt;
lemma todos_append:  &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;
  also have &amp;quot;... = ((P a ∧ todos P x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... =  (todos P (a # x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; 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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
apply (induct xs)&lt;br /&gt;
apply (auto simp add: todos_append)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, juacorvic&amp;quot;&lt;br /&gt;
&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;
 &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;
--&amp;quot;jeshorcob, juacorvic&amp;quot;&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 x 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 (x#xs)) = todos P ((rev xs) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [x])&amp;quot; &lt;br /&gt;
              by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [x])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P x)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P x ∧ todos P xs)&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos P (rev (x#xs)) = todos P (x#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, emimarriv&amp;quot;&lt;br /&gt;
&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; by auto&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;
(*Pedrosrei: No sé cómo has conseguido el contraejemplo,&lt;br /&gt;
  probablemente algún fallo en los paréntesis, ya que la propiedad &lt;br /&gt;
  resulta cierta como expongo abajo:&lt;br /&gt;
*)&lt;br /&gt;
(* jeshorcob: el contraejemplo existe. Fijate en lo siguiente: *)&lt;br /&gt;
fun p1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;p1 x = (x=3)&amp;quot;&lt;br /&gt;
fun q1 :: &amp;quot;int ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;q1 x = (x=2)&amp;quot;&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2]&amp;quot; -- &amp;quot;= False &lt;br /&gt;
  (porque ningún elemento de la lista cumple a la vez p1 y q1)&amp;quot;&lt;br /&gt;
value &amp;quot;(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= True &lt;br /&gt;
  (porque cada elemento de la lista cumple una sola de p1 y q1)&amp;quot;&lt;br /&gt;
(*Por tanto:*)&lt;br /&gt;
value &amp;quot;algunos (λx. p1 x ∧ q1 x) [3,2] = &lt;br /&gt;
(algunos p1 [3,2] ∧ algunos q1 [3,2])&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
(*Esta es una instancia del contraejemplo que encuentra QuickCheck*)&lt;br /&gt;
&lt;br /&gt;
&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 (metis (full_types) algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Al cambiar la definición de algunos para que coincida con list_ex es cierto el &lt;br /&gt;
contraejemplo de Jesús&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&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; 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) = ((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; using HI by simp&lt;br /&gt;
 (* Ya no podemos seguir más ya que no se cuemple: &lt;br /&gt;
      also have &amp;quot;... =  ((P a ∨ algunos P xs) ∧ (Q a ∨ algunos Q xs))   &lt;br /&gt;
   Tenemos que buscar un contraejemplo:&lt;br /&gt;
 *)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob, emimarriv, juacorvic&amp;quot;&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 {* Encuentra el contraejemplo&lt;br /&gt;
P = {a⇩1}&lt;br /&gt;
Q = {a⇩2}&lt;br /&gt;
xs = [a⇩1, a⇩2]&lt;br /&gt;
*}&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;
-- &amp;quot;javrodviv1, jeshorcob, juacorvic&amp;quot;&lt;br /&gt;
&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv, juacorvic&amp;quot;&lt;br /&gt;
 &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 ∘ 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)) = ((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; 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;
(*Pedrosrei: Pongo la automática que parece se os resiste.*) &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (metis algunos.simps(1) algunos.simps(2) list_nonempty_induct)&lt;br /&gt;
&lt;br /&gt;
(*Si corregís la definición de algunos sería: *)&lt;br /&gt;
&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;
(*jeshorcob: Pedro, a la tuya no sé que le pasa que no me la coge bien. &lt;br /&gt;
Dejo la mía *)&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob,juacorvic&amp;quot;&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;
-- &amp;quot;javrodviv1, jeshorcob, emimarriv&amp;quot;&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; &lt;br /&gt;
         using HI 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;
(*Igual que anterior, cambia uso de paréntesis y un paso más*)&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; &lt;br /&gt;
lemma algunos_append:  &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 by simp&lt;br /&gt;
also have &amp;quot;... = (algunos P (a # xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
finally show &amp;quot;algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)&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 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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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;
 &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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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 xs ∨ (P a))&amp;quot; using HI using algunos_append by auto&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;emimarriv&amp;quot;&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 x 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 (x#xs)) = algunos P ((rev xs)@[x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ (P x))&amp;quot; by (auto simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ (P x))&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot; algunos P (rev (x#xs)) = algunos P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&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;
--&amp;quot;jeshorcob&amp;quot;&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;
--&amp;quot;jeshorcob&amp;quot;&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; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x 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) (x # xs) = ((P x ∨ Q x) &lt;br /&gt;
          ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((P x ∨ Q x) ∨ (algunos P xs ∨ algunos Q xs))&amp;quot; &lt;br /&gt;
              using hi by simp&lt;br /&gt;
  also have &amp;quot;... = (P x  ∨ algunos P xs ∨ Q x ∨ algunos Q xs)&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot; algunos (λx. P x ∨ Q x) (x # xs) =&lt;br /&gt;
                  (algunos P (x # xs) ∨ algunos Q (x # 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;
(*Pedrosrei: Es falso.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo P= esVacio, xs = []. P es la propiedad de ser vacío&lt;br /&gt;
con nuestra construcción de algunos es cierto &amp;quot;algunos esVacio []&amp;quot;&lt;br /&gt;
Sin embargo, todos (λx. (¬ esVacio {})) [] es lo mismo que &lt;br /&gt;
todos _ [] = True, por lo que ¬(todos (λx. (¬ esVacio {})) []) = False,&lt;br /&gt;
siendo falsa nuestra definición. Podemos coger de todas maneras la propiedad&lt;br /&gt;
que queramos y sigue siendo falso porque &lt;br /&gt;
(algunos _ [] True) ∧ (¬(todos _ [])= False)&lt;br /&gt;
 *)&lt;br /&gt;
lemma &lt;br /&gt;
shows &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(*Al corregir la definición de &amp;quot;algunos&amp;quot; deja de ser cierto lo dicho y &lt;br /&gt;
correcto lo de abajo.&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: está claro que el fallo en todo era la definición esa*)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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;
&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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot;&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;
  finally show &amp;quot;algunos P (a # xs) =(¬ todos (λx. ¬ P x) (a#xs))&amp;quot; by auto&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;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &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) = ((x=a) ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;estaEn (2::nat) [3,2,4]&amp;quot; --&amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;estaEn (1::nat) [3,2,4]&amp;quot; --&amp;quot;= 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;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. x=y) xs = estaEn y xs&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;estaEn y (x#xs) = (y=x ∨ estaEn y xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (y=x ∨ algunos (λx. (x=y)) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (x#xs) = (estaEn x xs ∨ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: Esta definición no es correcta. Véanse:*)&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun sinDuplicados2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados2 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;sinDuplicados2 (x#xs) = (¬(estaEn x xs) ∧ sinDuplicados2 xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;sinDuplicados2 [1::nat,4,2,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;emimarriv&amp;quot;&lt;br /&gt;
fun sinDuplicados3 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados3 [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados3 (x#xs) = (if estaEn x xs then False else sinDuplicados3 xs )&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
 &lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (x#xs) = (if estaEn x xs then borraDuplicados xs else (x#(borraDuplicados xs)))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.1. Demostrar o refutar automáticamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
lemma &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16.2. Demostrar o refutar detalladamente&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1, jeshorcob&amp;quot; &lt;br /&gt;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length (borraDuplicados (a#xs))≤length (a#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 1+ length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... ≤ 1+ length xs&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;length (borraDuplicados (a # xs)) ≤ length (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.1. Demostrar o refutar automáticamente &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;javrodviv1&amp;quot; &lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
apply (induct xs, auto)&lt;br /&gt;
done&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17.2. Demostrar o refutar detalladamente&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: con esta definición de borraDuplicados es falso si cogemos&lt;br /&gt;
xs= []. Además del quickcheck, podemos hacer &amp;quot;apply (induct xs, auto)&amp;quot; &lt;br /&gt;
y ver que nos pide que demostremos False.&lt;br /&gt;
*)&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*jeshorcob: dejo la prueba por inducción y casos*)&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (x#xs)) = estaEn a (x#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume a1:&amp;quot;estaEn x xs&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) = &lt;br /&gt;
                estaEn a (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = estaEn a (x#xs)&amp;quot; using a1 by auto&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume a2:&amp;quot;¬(estaEn x xs)&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn a (borraDuplicados (x#xs)) =&lt;br /&gt;
                estaEn a (x#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (a = x ∨ estaEn a (borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis using hi by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.1. Demostrar o refutar automáticamente &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: estaEn_borraDuplicados)&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18.2. Demostrar o refutar detalladamente&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados2 (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume hi: &amp;quot;sinDuplicados2 (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;sinDuplicados2 (borraDuplicados (x#xs)) =&lt;br /&gt;
          sinDuplicados2 ((if estaEn x xs then borraDuplicados xs &lt;br /&gt;
                           else x # borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (if estaEn x xs &lt;br /&gt;
                      then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                    else sinDuplicados2 (x#borraDuplicados xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs)&lt;br /&gt;
                   else (¬estaEn x (borraDuplicados xs) &lt;br /&gt;
                          ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...= (if estaEn x xs then sinDuplicados2 (borraDuplicados xs) &lt;br /&gt;
                   else (¬estaEn x xs ∧ sinDuplicados2 (borraDuplicados xs)))&amp;quot;&lt;br /&gt;
                     by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
then show &amp;quot;sinDuplicados2 (borraDuplicados (x#xs))&amp;quot; &lt;br /&gt;
             using hi by (simp add: estaEn_borraDuplicados)&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
 (*Pedrosrei: es falso, como podemos ver si cogemos [1,2,1] y evaluamos:&lt;br /&gt;
*)&lt;br /&gt;
lemma &amp;quot;borraDuplicados&amp;#039; (rev xs) = rev (borraDuplicados&amp;#039; xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo&lt;br /&gt;
xs = [a⇩1, a⇩2, a⇩1]&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
borraDuplicados (rev xs) = [a⇩2, a⇩1]&lt;br /&gt;
rev (borraDuplicados xs) = [a⇩1, a⇩2]&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juacorvic</name></author>
		
	</entry>
</feed>