<?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=Javrodviv1</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=Javrodviv1"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php/Especial:Contribuciones/Javrodviv1"/>
	<updated>2026-07-17T13:51:27Z</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_8&amp;diff=218</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=218"/>
		<updated>2014-12-08T12:49:18Z</updated>

		<summary type="html">&lt;p&gt;Javrodviv1: &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&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;
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;
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&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;
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;
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;
&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&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;
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;
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;
&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;
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;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Javrodviv1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=217</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=217"/>
		<updated>2014-12-08T12:36:39Z</updated>

		<summary type="html">&lt;p&gt;Javrodviv1: &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&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;
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;
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&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;
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;
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;
&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;
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;
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;
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;
&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;
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;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Javrodviv1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_8&amp;diff=213</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=213"/>
		<updated>2014-12-06T12:10:52Z</updated>

		<summary type="html">&lt;p&gt;Javrodviv1: &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&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;
fun min :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;min 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;
fun profundidad1 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad1 H = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad1 (N a b) = 1 + max (profundidad1 a) (profundidad1 b)&amp;quot;&lt;br /&gt;
&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 + min (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;
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&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;
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;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. (size a) es el número de nodos del árbol a. Por ejemplo,&lt;br /&gt;
     size (N (N H H) (N H H)) = 3&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H))&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;
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 {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que un árbol binario a es completo respecto del&lt;br /&gt;
  número de hojas syss es completo respecto del número de nodos&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
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 {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que (abc n) es un árbol binario completo.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
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;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Encontrar una medida f tal que (es_abc f) es distinto de &lt;br /&gt;
  (es_abc size).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Javrodviv1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=103</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=103"/>
		<updated>2014-11-16T15:23:42Z</updated>

		<summary type="html">&lt;p&gt;Javrodviv1: &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&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;
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;
--&amp;quot;jeshorcob,javrodviv1&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 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos 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 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 True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&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 ∨ 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;
&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;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;
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&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&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_append:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix a x&lt;br /&gt;
  assume HI:&amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a # x) @ y) = ((P a) ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot; ... = ((P a) ∧ todos P x ∧ todos P y)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; &lt;br /&gt;
         by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.1. Demostrar o refutar automáticamente &lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&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&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&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&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;
--&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;
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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
(* A mi no me encuentra contraejemplo así que decidí probarlo pero me&lt;br /&gt;
     atasque, dejo mi demostración hasta donde estoy atascado*)&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 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; &lt;br /&gt;
    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;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7.1. Demostrar o refutar automáticamente &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&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&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;
 &lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&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&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;
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&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&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;
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;
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;
-- &amp;quot;javrodviv1&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;
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&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&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;
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;
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;
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&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&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&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;
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;
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;
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;
lemma &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&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;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&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>Javrodviv1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=102</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=102"/>
		<updated>2014-11-16T14:21:55Z</updated>

		<summary type="html">&lt;p&gt;Javrodviv1: &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&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;
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;
--&amp;quot;jeshorcob,javrodviv1&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 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos 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 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 True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&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 ∨ 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;
&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;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;
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&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&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_append:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix a x&lt;br /&gt;
  assume HI:&amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a # x) @ y) = ((P a) ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot; ... = ((P a) ∧ todos P x ∧ todos P y)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; &lt;br /&gt;
         by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.1. Demostrar o refutar automáticamente &lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&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&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&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&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;
--&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;
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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
(* A mi no me encuentra contraejemplo así que decidí probarlo pero me&lt;br /&gt;
     atasque, dejo mi demostración hasta donde estoy atascado*)&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 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; &lt;br /&gt;
    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;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7.1. Demostrar o refutar automáticamente &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&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&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;
 &lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&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&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;
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&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&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;
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;
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;
-- &amp;quot;javrodviv1&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;
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&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;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x xs = undefined&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;
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;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados xs = undefined&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;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados xs = undefined&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;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&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;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&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;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&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;
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;
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;
lemma &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&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;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&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>Javrodviv1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=101</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=101"/>
		<updated>2014-11-16T13:17:12Z</updated>

		<summary type="html">&lt;p&gt;Javrodviv1: &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&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;
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;
--&amp;quot;jeshorcob,javrodviv1&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 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos 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 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 True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&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 ∨ 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;
&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;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;
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&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&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_append:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix a x&lt;br /&gt;
  assume HI:&amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a # x) @ y) = ((P a) ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot; ... = ((P a) ∧ todos P x ∧ todos P y)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; &lt;br /&gt;
         by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.1. Demostrar o refutar automáticamente &lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&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&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&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&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;
--&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;
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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
(* A mi no me encuentra contraejemplo así que decidí probarlo pero me&lt;br /&gt;
     atasque, dejo mi demostración hasta donde estoy atascado*)&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 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; &lt;br /&gt;
    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;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7.1. Demostrar o refutar automáticamente &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&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&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;
 &lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&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;
lemma algunos_append:&lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&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;
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;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&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;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&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;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x xs = undefined&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;
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;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados xs = undefined&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;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados xs = undefined&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;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&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;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&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;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&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;
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;
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;
lemma &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&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;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&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>Javrodviv1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_5&amp;diff=100</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=100"/>
		<updated>2014-11-15T20:31:28Z</updated>

		<summary type="html">&lt;p&gt;Javrodviv1: &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&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;
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;
--&amp;quot;jeshorcob,javrodviv1&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 [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;algunos 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 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 True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Demostrar o refutar automáticamente &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&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;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;
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&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&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_append:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix a x&lt;br /&gt;
  assume HI:&amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a # x) @ y) = ((P a) ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot; ... = ((P a) ∧ todos P x ∧ todos P y)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot; &lt;br /&gt;
         by simp&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.1. Demostrar o refutar automáticamente &lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
--&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&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&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&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;
--&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;
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;
-- &amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
(* A mi no me encuentra contraejemplo así que decidí probarlo pero me&lt;br /&gt;
     atasque, dejo mi demostración hasta donde estoy atascado*)&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 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; &lt;br /&gt;
    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;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7.1. Demostrar o refutar automáticamente &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;javrodviv1&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&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;
 &lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&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;
lemma algunos_append:&lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&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;
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;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&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;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&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;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x xs = undefined&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;
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;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados xs = undefined&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;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados xs = undefined&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;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&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;
lemma length_borraDuplicados:&lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&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;
lemma &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&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;
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;
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;
lemma &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&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;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&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>Javrodviv1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_4&amp;diff=96</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_4&amp;diff=96"/>
		<updated>2014-11-14T17:09:15Z</updated>

		<summary type="html">&lt;p&gt;Javrodviv1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R4: Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
theory R4&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar,javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] a = [a]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) a = x # (snoc xs a)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar automáticamente el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar,javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&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 detalladamente el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar,javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  have &amp;quot;snoc (x#xs) a = x # (snoc xs a)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x # (xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;snoc (x#xs) a = (x#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar automáticamente el siguiente lema&lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar,javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (auto simp add: snoc_append)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar detalladamente el siguiente lema&lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar,javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;rev (x # xs) = (rev xs) @ [x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
  finally show &amp;quot;rev (x # xs) = snoc (rev xs) x&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>Javrodviv1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_3&amp;diff=84</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_3&amp;diff=84"/>
		<updated>2014-11-13T11:50:30Z</updated>

		<summary type="html">&lt;p&gt;Javrodviv1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R3: Razonamiento sobre programas en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     sumaImpares :: nat ⇒ nat&lt;br /&gt;
  tal que (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 5  =  25&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
(* Pedrosrei: como no veo a nadie animarse pongo las dos primeras a ver si sirve de ayuda: *)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar juacorvic jeshorcob domcadgom javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0 = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sumaImpares (Suc n) = (2*n+1) + sumaImpares n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;marnajgom&amp;quot;&lt;br /&gt;
fun sumaImpares2 :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares2 0 = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sumaImpares2 (Suc n) = (Suc n)+ n + sumaImpares2 n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun sumaImpares3 :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares3 n = foldr (λ x y. y + (2 * x) + 1) (upt 0  n) 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Esta definición en principio es más eficiente pero a la hora de&lt;br /&gt;
 demostrar se complica todo. Estaría bien si en clase pudieramos &lt;br /&gt;
explicar si se puede demostrar el lema usando esta definición de &lt;br /&gt;
manera sencilla o explicar un poco cómo iría la prueba *)&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaImpares 5&amp;quot; -- &amp;quot;= 25&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que &lt;br /&gt;
     sumaImpares n = n*n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
(* Pedrosrei: lo dejo de menos a más estructurado *)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
apply (induct n) apply auto&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar juacorvic jeshorcob&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaImpares 0 = 0 * 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaImpares n = n * n&amp;quot;&lt;br /&gt;
  thus &amp;quot;sumaImpares (Suc n) = Suc n * Suc n&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar juacorvic marnajgom jeshorcob domcadgom javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaImpares 0 = 0 * 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaImpares (Suc n) = sumaImpares n + (2*n + 1)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = n*n + 2*n + 1&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (n + 1) * (n + 1)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaImpares (Suc n) = Suc n * Suc n&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar juacorvic marnajgom jeshorcob domcadgom javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot;&lt;br /&gt;
| &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^(Suc n) + sumaPotenciasDeDosMasUno n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno 3&amp;quot; -- &amp;quot;= 16&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar juacorvic jeshorcob&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  thus &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^(Suc n + 1)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar juacorvic marnajgom jeshorcob domcadgom javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = sumaPotenciasDeDosMasUno n + 2^(Suc n)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 2^(n+1) + 2^(Suc n)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = 2^(Suc n + 1)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^(Suc n + 1)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar juacorvic marnajgom jeshorcob domcadgom javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia 0 x = []&amp;quot;&lt;br /&gt;
| &amp;quot;copia (Suc n) x = x # copia n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;copia 3 x&amp;quot; -- &amp;quot;= [x,x,x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar juacorvic marnajgom jeshorcob domcadgom javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos p (x#xs) = ((p x) ∧ (todos p xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* jeshorcob: me gustaría saber por qué es necesario poner el paréntesis en la definición(2) *)&lt;br /&gt;
(*Pedrosrei: porque aunque están predefinidas las prioridades entre la suma y el producto en &lt;br /&gt;
los cuerpos y anillos más comunes, la conjunción y la igualdad no tienen definida esa prioridad*)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que todos los elementos de (copia n x) son&lt;br /&gt;
  iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar juacorvic jeshorcob&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar marnajgom jeshorcob domcadgom javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;todos (λy. y=x) (copia 0 x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λy. y=x) (copia (Suc n) x) = todos (λy. y=x) (x#(copia n x))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = todos (λy. y=x) (copia n x)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λy. y=x) (copia (Suc n) x)&amp;quot; using HI by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic jeshorcob&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;todos (λy. y=x) (copia 0 x)&amp;quot; by simp&lt;br /&gt;
  fix n&lt;br /&gt;
    assume HI: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
    thus  &amp;quot;todos (λy. y=x) (copia (Suc n) x)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;todos (λy. y=x) (copia 0 x)&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λy. y=x) (copia (Suc n) x) = todos (λy. y=x)  (x # (copia n x))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...=todos (λy. y=x)[x]&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λy. y=x) (copia (Suc n) x)&amp;quot; using HI by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
    factR :: nat ⇒ nat&lt;br /&gt;
  tal que (factR n) es el factorial de n. Por ejemplo,&lt;br /&gt;
    factR 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar juacorvic marnajgom jeshorcob domcadgom javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun factR :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factR 0 = 1&amp;quot;&lt;br /&gt;
| &amp;quot;factR (Suc n) = (Suc n) * factR n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;factR 4&amp;quot; -- &amp;quot;= 24&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
     &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
  Demostrar que, para todo n y todo x, se tiene &lt;br /&gt;
     factI&amp;#039; n x = x * factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; 0       x = x&amp;quot;&lt;br /&gt;
| &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = factI&amp;#039; n 1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;factI 4&amp;quot; -- &amp;quot;= 24&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;davoremar jeshorcob domcadgom&amp;quot;&lt;br /&gt;
lemma fact1: &amp;quot;factI&amp;#039; n x = x* factR n&amp;quot;&lt;br /&gt;
by (induct n arbitrary: x) auto &lt;br /&gt;
&lt;br /&gt;
(*juacorvic: ¿Por que tenemos que indicar arbitrary:x? *)&lt;br /&gt;
(*Pedrosrei: no tienes que hacerlo como resulta de mi ejemplo o las &lt;br /&gt;
correcciones que he indicado en el tuyo. En este caso concreto totalmente&lt;br /&gt;
automatizado es porque posees dos variables y tienes que decirle &lt;br /&gt;
qué hacer con cada una. En una haces la inducción pero la otra la dejas sin&lt;br /&gt;
tocar, o como solemos decir: &amp;quot;sea un x cualquiera...&amp;quot;&lt;br /&gt;
*)&lt;br /&gt;
-- &amp;quot;davoremar jeshorcob domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma fact: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
proof (induct n arbitrary: x)&lt;br /&gt;
  show &amp;quot;⋀x. factI&amp;#039; 0 x = x * factR 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n x&lt;br /&gt;
  assume HI: &amp;quot;⋀x. factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
  have &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x * factI&amp;#039; n (Suc n)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x * ((Suc n) * factR n)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = x * factR (Suc n)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* marnajgom: no entiendo el paso &amp;quot;also have &amp;quot;... = x * factI&amp;#039; &lt;br /&gt;
n (Suc n)&amp;quot; by simp&amp;quot; ¿Por qué no sacas fuera (Suc n)*x, sólo sacas&lt;br /&gt;
 x?*)&lt;br /&gt;
&lt;br /&gt;
(* Pedrosrei: También podemos prescindir de arbitrary x *)&lt;br /&gt;
&lt;br /&gt;
lemma fact2: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;factI&amp;#039; 0 x = x * factR 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
  show &amp;quot;factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;factI&amp;#039; (Suc n) x = (factI&amp;#039; n (Suc n))*x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot; ... = ((Suc n) * factR n) * x&amp;quot; using HI fact by simp&lt;br /&gt;
-- &amp;quot;Si usamos auto: finally show ?thesis by auto    &amp;quot;&lt;br /&gt;
    also have &amp;quot; ... = x * factR (Suc n)&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;
(*Pedrosrei: no resuelve finally debido a la conjunción grande que emplea isabelle para&lt;br /&gt;
indicarte un &amp;quot;para todo de cualquier conjunto&amp;quot; (en realidad es la conjunción de conjuntos, creo recordar).&lt;br /&gt;
Si quieres poner un para todo recurre a ! ó \forall. Si sólo has puesto lo que te ha indicado la máquina,&lt;br /&gt;
quería indicarte un valor cualquiera, vamos, lo que fijas con &amp;quot;arbitrary&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Sólo tienes que eliminar los ⋀ de la prueba&lt;br /&gt;
y añadirle un paso intermedio con la regla adecuada (usa find_theorem y el nombre que crees&lt;br /&gt;
que tendrá) entre el also have último y el finally&lt;br /&gt;
para que vea la igualdad de derecha a izquierda y listo. También puedes emplear &amp;quot;by arith&amp;quot; para &lt;br /&gt;
estas cosas tan sencillas y no tener que irte a la regla exacta de la aritmética (que no siempre&lt;br /&gt;
es fácil).&lt;br /&gt;
&lt;br /&gt;
*)&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; (* Se intenta demostración en sentido inverso: &amp;#039;&amp;#039; x * factR n = factI&amp;#039; n x &amp;#039;&amp;#039;&lt;br /&gt;
                  No resuelve finally *)&lt;br /&gt;
&lt;br /&gt;
lemma fact: &amp;quot; x * factR n = factI&amp;#039; n x &amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
    show &amp;quot;⋀x.  x * factR 0 = factI&amp;#039; 0 x&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    fix n &lt;br /&gt;
    assume HI: &amp;quot;⋀x. x * factR n = factI&amp;#039; n x &amp;quot;&lt;br /&gt;
    have &amp;quot;x * factR (Suc n) = x * (factR n * (Suc n))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x * ((Suc n) * factR n)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x * (factI&amp;#039; n (Suc n))&amp;quot; using HI by simp  &lt;br /&gt;
    also have &amp;quot;... = factI&amp;#039; (Suc n) x&amp;quot; by simp    &lt;br /&gt;
    finally show &amp;quot; x * factR (Suc n) = factI&amp;#039; (Suc n) x&amp;quot; by simp    &lt;br /&gt;
qed&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que&lt;br /&gt;
     factI n = factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar juacorvic jeshorcob domcadgom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
by (simp add: fact)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
proof - &lt;br /&gt;
  show &amp;quot;factI n = factR n&amp;quot; by (simp add:fact)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar juacorvic jeshorcob&amp;quot;&lt;br /&gt;
&lt;br /&gt;
corollary &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;factI n = factI&amp;#039; n 1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 1 * factR n&amp;quot; by (simp add: fact)&lt;br /&gt;
  finally show &amp;quot;factI n = factR n&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;marnajgom javrodviv1&amp;quot; &lt;br /&gt;
corollary &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;factI 0 = factR 0&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI:&amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
  have &amp;quot;factI (Suc n) = factI&amp;#039; (Suc n) 1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = factI&amp;#039; n (Suc n)*1&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (Suc n)*1 * factR n&amp;quot; using fact by simp&lt;br /&gt;
  also have &amp;quot;... = (Suc n) * factR n&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;factI (Suc n) = factR (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar marnajgom jeshorcob domcadgom javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;amplia (x#xs) y = x # (amplia xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;amplia [d,a] t&amp;quot; -- &amp;quot;= [d,a,t]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar que &lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; (*Añado esquema intermedio*)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
show &amp;quot;amplia [] y = [] @ [y]&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;  &lt;br /&gt;
  thus &amp;quot;amplia (a # xs) y = (a # xs) @ [y]&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;davoremar marnajgom jeshorcob domcadgom javrodviv1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;amplia [] y = [] @ [y]&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x # (xs @ [y])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (x#xs) @ [y]&amp;quot; by simp (*Pedrosrei: prescindible *)&lt;br /&gt;
  finally show &amp;quot;amplia (x#xs) y = (x#xs) @ [y]&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*Pedrosrei: las variables son mudas. Da igual &amp;#039;a&amp;#039; que &amp;#039;x&amp;#039;, del mismo modo que da igual en papel el nombre de&lt;br /&gt;
la incógnita. Puedes usar &amp;#039;incognitabonita&amp;#039; y sigue siendo lo mismo *)&lt;br /&gt;
-- &amp;quot;juacorvic&amp;quot; (* Demostración idéntica a &amp;#039;davoremar&amp;#039; pero el sistema me sugirió usar &amp;#039;a&amp;#039; en vez de &amp;#039;x&amp;#039; *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
show &amp;quot;amplia [] y = [] @ [y]&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (a # xs) y  =  a # (amplia xs y) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = a # (xs @ [y])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (a # xs) @ [y]&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;amplia (a # xs) y = (a # xs) @ [y]&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Javrodviv1</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_1&amp;diff=20</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Relaci%C3%B3n_1&amp;diff=20"/>
		<updated>2014-11-02T09:22:36Z</updated>

		<summary type="html">&lt;p&gt;Javrodviv1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R1: Programación funcional en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory R1&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 0. Definir, por recursión, la función&lt;br /&gt;
     factorial :: nat ⇒ nat&lt;br /&gt;
  tal que (factorial n) es el factorial de n. Por ejemplo,&lt;br /&gt;
     factorial 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;,&amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun factorial :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factorial 0   = 1 &amp;quot;&lt;br /&gt;
 |&amp;quot;factorial (Suc m) = (Suc m) * factorial m&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;factorial 4&amp;quot; -- &amp;quot;24&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;#039;a list ⇒ nat&lt;br /&gt;
  tal que (longitud xs) es la longitud de la listas xs. Por ejemplo,&lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;,&amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud [] = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;longitud (x#xs) = 1 + longitud xs&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
value &amp;quot;longitud [4,2,5]&amp;quot; -- &amp;quot;= 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&lt;br /&gt;
  tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
  componentes del par p. Por ejemplo,&lt;br /&gt;
     intercambia (u,v) = (v,u)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;,&amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia (x,y) = (y,x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia (u,v)&amp;quot; -- &amp;quot;= (v,u)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversa xs) es la lista obtenida invirtiendo el orden de los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     inversa [a,d,c] = [c,d,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;inversa (x#xs) = (inversa xs) @ [x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun inversa2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
&amp;quot;inversa2 [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;inversa2 xs = (last xs)#(inversa2 (butlast xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa [a,d,c]&amp;quot; -- &amp;quot;= [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     repite :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (repite n x) es la lista formada por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     repite 3 a = [a,a,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;,&amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite 0 x = []&amp;quot;&lt;br /&gt;
 |&amp;quot;repite (Suc m) x = x # (repite m x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite 3 a&amp;quot; -- &amp;quot;= [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     conc :: &amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (conc xs ys) es la concatención de las listas xs e ys. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     conc [a,d] [b,d,a,c] = [a,d,b,d,a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;,&amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc [] ys = ys&amp;quot;&lt;br /&gt;
 |&amp;quot;conc (x#xs) ys = x#(conc xs ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc [a,d] [b,d,a,c]&amp;quot; -- &amp;quot;= [a,d,b,d,a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     coge :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por &lt;br /&gt;
  ejemplo, &lt;br /&gt;
     coge 2 [a,c,d,b,e] = [a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;,&amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge _ [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;coge 0 xs = []&amp;quot;&lt;br /&gt;
 |&amp;quot;coge (Suc m) (x#xs) = x#(coge m xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge 2 [a,c,d,b,e]&amp;quot; -- &amp;quot;= [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;,&amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina _ [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;elimina 0 xs = xs&amp;quot;&lt;br /&gt;
 |&amp;quot;elimina (Suc m) (x#xs) = elimina m xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [a,c,d,b,e]&amp;quot; -- &amp;quot;= [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
     esVacia :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo,&lt;br /&gt;
     esVacia []  = True&lt;br /&gt;
     esVacia [1] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;,&amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia [] = True&amp;quot;&lt;br /&gt;
 |&amp;quot;esVacia _ = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;esVacia []&amp;quot;  -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;esVacia [1]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     inversaAc :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [a,c,b,e] = [e,b,c,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun inversaAcAux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux [] ys = ys&amp;quot;&lt;br /&gt;
 |&amp;quot;inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc xs = inversaAcAux xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc [a,c,b,e]&amp;quot; -- &amp;quot;= [e,b,c,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función&lt;br /&gt;
     sum :: nat list ⇒ nat&lt;br /&gt;
  tal que (sum xs) es la suma de los elementos de xs. Por ejemplo,&lt;br /&gt;
     sum [3,2,5] = 10&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;,&amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun sum :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum [] = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;sum (x#xs) = x + sum xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;&lt;br /&gt;
fun sum2 :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum2 xs = foldr (op +) xs 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum [3,2,5]&amp;quot; -- &amp;quot;= 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función&lt;br /&gt;
     map :: (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&lt;br /&gt;
  tal que (map f xs) es la lista obtenida aplicando la función f a los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     map (λx. 2*x) [3,2,5] = [6,4,10]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;jeshorcob&amp;quot;,&amp;quot;javrodviv1&amp;quot;&lt;br /&gt;
fun map :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map f [] = []&amp;quot;&lt;br /&gt;
 |&amp;quot;map f (x#xs) = (f x)#(map f xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map (λx. 2*x) [3::nat,2,5]&amp;quot; -- &amp;quot;= [6,4,10]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Javrodviv1</name></author>
		
	</entry>
</feed>