<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?action=history&amp;feed=atom&amp;title=Tema_15</id>
	<title>Tema 15 - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?action=history&amp;feed=atom&amp;title=Tema_15"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;action=history"/>
	<updated>2026-07-19T10:49:47Z</updated>
	<subtitle>Historial de revisiones para esta página en el wiki</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=544&amp;oldid=prev</id>
		<title>Mjoseh en 07:10 27 may 2013</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=544&amp;oldid=prev"/>
		<updated>2013-05-27T07:10:21Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;amp;diff=544&amp;amp;oldid=530&quot;&gt;Mostrar los cambios&lt;/a&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=530&amp;oldid=prev</id>
		<title>Mjoseh: Página blanqueada</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=530&amp;oldid=prev"/>
		<updated>2013-05-22T08:21:18Z</updated>

		<summary type="html">&lt;p&gt;Página blanqueada&lt;/p&gt;
&lt;a href=&quot;https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;amp;diff=530&amp;amp;oldid=526&quot;&gt;Mostrar los cambios&lt;/a&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=526&amp;oldid=prev</id>
		<title>Mjoseh en 08:13 22 may 2013</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=526&amp;oldid=prev"/>
		<updated>2013-05-22T08:13:02Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revisión del 08:13 22 may 2013&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Línea 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang = Isar&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang = &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;&lt;/ins&gt;Isar&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;header {* Tema 15: Razonamiento sobre programas en Isabelle *}&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;header {* Tema 15: Razonamiento sobre programas en Isabelle *}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=525&amp;oldid=prev</id>
		<title>Mjoseh: Página creada con &#039;&lt;source lang = Isar&quot;&gt; header {* Tema 15: Razonamiento sobre programas en Isabelle *}  theory T15 imports Main begin  text {*    En este tema se demuestra con Isabelle las propie...&#039;</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=525&amp;oldid=prev"/>
		<updated>2013-05-22T08:12:34Z</updated>

		<summary type="html">&lt;p&gt;Página creada con &amp;#039;&amp;lt;source lang = Isar&amp;quot;&amp;gt; header {* Tema 15: Razonamiento sobre programas en Isabelle *}  theory T15 imports Main begin  text {*    En este tema se demuestra con Isabelle las propie...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang = Isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 15: Razonamiento sobre programas en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory T15&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En este tema se demuestra con Isabelle las propiedades de los&lt;br /&gt;
  programas funcionales como se expone en el tema 8 del curso&lt;br /&gt;
  &amp;quot;Informática&amp;quot; que puede leerse en&lt;br /&gt;
  http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-8t.pdf&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento ecuacional *}&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&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;
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. Demostrar que &lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud [4,2,5] = 3&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot;&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;
     &amp;quot;intercambia (2,3) = (3,2)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&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 (2,3)&amp;quot; -- &amp;quot;= (3,2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que &lt;br /&gt;
     intercambia (intercambia (x,y)) = (x,y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;intercambia (intercambia (x,y)) = (x,y)&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&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 [3,2,5] = [5,2,3]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&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;
value &amp;quot;inversa [3,2,5]&amp;quot; -- &amp;quot;= [5,2,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que &lt;br /&gt;
     inversa [x] = [x]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;inversa [x] = [x]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  tal que . Por ejemplo,&lt;br /&gt;
     repite 3 5 = [5,5,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&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 n) x = x # (repite n x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite 3 5&amp;quot; -- &amp;quot;= [5,5,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que &lt;br /&gt;
     longitud (repite n x) = n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
apply (induct_tac n) &lt;br /&gt;
apply (auto)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
lemma longitud_repite:&lt;br /&gt;
  &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;longitud (repite 0 x) = 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume hi: &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
  show &amp;quot;longitud (repite (Suc n) x) = Suc n&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;longitud (repite (Suc n) x) = longitud (x # (repite n x))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 +  longitud (repite n x)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + n&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = 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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que . Por ejemplo,&lt;br /&gt;
     conc [2,3] [4,3,5] = [2,3,4,3,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&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 [2,3] [4,3,5]&amp;quot; -- &amp;quot;= [2,3,4,3,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que &lt;br /&gt;
     conc xs (conc ys zs) = (conc xs ys) zs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa:&lt;br /&gt;
  &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;conc [] (conc ys zs) = conc (conc [] ys) zs&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
  show &amp;quot;conc (x # xs) (conc ys zs) = conc (conc (x # xs) ys) zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;conc (x # xs) (conc ys zs) = x # (conc xs (conc ys zs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x # (conc (conc xs ys) zs)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = conc (x#(conc xs ys)) zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = conc (conc (x # xs) ys) zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Refutar que &lt;br /&gt;
     conc xs ys = conc ys xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs ys = conc ys xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo, &lt;br /&gt;
  xs = [a\&amp;lt;^isub&amp;gt;2]&lt;br /&gt;
  ys = [a\&amp;lt;^isub&amp;gt;1] *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar que &lt;br /&gt;
     conc xs [] = xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs [] = xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar que &lt;br /&gt;
     longitud (conc xs ys) = longitud xs + longitud ys&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma long_conc:&lt;br /&gt;
  &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;longitud (conc [] ys) = longitud [] + longitud ys&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
  show &amp;quot;longitud (conc (x # xs) ys) = longitud (x # xs) + longitud ys&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;longitud (conc (x # xs) ys) = longitud (x # (conc xs ys))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + longitud (conc xs ys)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + (longitud xs + longitud ys)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = (1+ longitud xs) + longitud ys&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = longitud (x # xs) + longitud ys&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función&lt;br /&gt;
     coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&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 [3,7,5,4] = [3,7]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge n [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge 0 xs = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge (Suc n) (x#xs) = x # (coge n xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge 2 [3,7,5,4]&amp;quot; -- &amp;quot;= [3,7]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función&lt;br /&gt;
     elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&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;
     elimina 2 [3,7,5,4] = [5,4]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&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 n [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x#xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [3,7,5,4]&amp;quot; -- &amp;quot;= [5,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar que &lt;br /&gt;
     conc (coge n xs) (elimina n xs) = xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
by (induct rule: coge.induct) auto&lt;br /&gt;
&lt;br /&gt;
text {* coge.induct es el esquema de inducción asociado a la definición&lt;br /&gt;
  de la función coge. Puede verse como sigue: *}&lt;br /&gt;
&lt;br /&gt;
thm coge.induct&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
by (induct rule: elimina.induct) auto&lt;br /&gt;
&lt;br /&gt;
thm elimina.induct&lt;br /&gt;
&lt;br /&gt;
lemma conc_coge_elimina:&lt;br /&gt;
  &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
proof (induct rule: coge.induct) &lt;br /&gt;
  show &amp;quot;⋀n. conc (coge n []) (elimina n []) = []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀v va. conc (coge 0 (v # va)) (elimina 0 (v # va)) = v # va&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs n &lt;br /&gt;
  assume hi: &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
  show &amp;quot;conc (coge (Suc n) (x # xs)) (elimina (Suc n) (x # xs)) = x # xs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;conc (coge (Suc n) (x # xs)) (elimina (Suc n) (x # xs)) = conc (coge (Suc n) (x # xs)) (elimina n xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = conc (x# (coge n xs)) (elimina n xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x#(conc (coge n xs) (elimina n xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (x#xs)&amp;quot; using hi by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función&lt;br /&gt;
     esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot;&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;
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 (x#xs) = 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 18. Demostrar que &lt;br /&gt;
     esVacia xs = esVacia (conc xs xs)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma vacia_conc:&lt;br /&gt;
  &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;esVacia [] = esVacia (conc [] [])&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    fix x xs&lt;br /&gt;
    assume hi: &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
    show &amp;quot;esVacia (x # xs) = esVacia (conc (x # xs) (x # xs))&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;esVacia (conc (x # xs) (x # xs)) = esVacia (x# (conc xs (x#xs)))&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = esVacia (x # xs)&amp;quot; by simp&lt;br /&gt;
      finally show ?thesis by simp&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma vacia_conc&amp;#039;:&lt;br /&gt;
  &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus ?thesis by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus ?thesis by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma vacia_conc&amp;#039;&amp;#039;:&lt;br /&gt;
  &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
by (cases xs) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Definir la función&lt;br /&gt;
     inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [3,2,5] = [5,2,3]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversaAcAux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux [] ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc xs = inversaAcAux xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc [3,2,5]&amp;quot; -- &amp;quot;= [5,2,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar que &lt;br /&gt;
     inversaAcAux xs ys = (inversa xs)@ys&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma inversaAcAux_es_inversa:&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = (inversa xs)@ys&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: ys) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma inversaAcAux_es_inversa_b:&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = (inversa xs)@ys&amp;quot;&lt;br /&gt;
proof (induct xs arbitrary: ys) &lt;br /&gt;
  show &amp;quot;⋀ys. inversaAcAux [] ys = inversa [] @ ys&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs zs&lt;br /&gt;
  assume hi: &amp;quot;⋀ys. inversaAcAux xs ys = inversa xs @ ys&amp;quot;&lt;br /&gt;
  show &amp;quot;inversaAcAux (x#xs) zs = inversa (x#xs) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;inversaAcAux (x#xs) zs = inversaAcAux xs (x#zs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = inversa xs @ (x#zs)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = inversa xs @ [x] @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = inversa (x#xs) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar que &lt;br /&gt;
     inversaAc xs = inversa xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
corollary &amp;quot;inversaAc xs = inversa xs&amp;quot;&lt;br /&gt;
by (simp add: inversaAcAux_es_inversa)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Definir la función&lt;br /&gt;
     sum :: &amp;quot;int list ⇒ int&amp;quot; &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;
fun sum :: &amp;quot;int list ⇒ int&amp;quot; where&lt;br /&gt;
  &amp;quot;sum []     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sum (x#xs) = x + sum xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum [3,2,5]&amp;quot; -- &amp;quot;= 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. 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;
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::int,2,5]&amp;quot; -- &amp;quot;= [6,4,10]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map (λx. 6*x) [3::int,2,5]&amp;quot; -- &amp;quot;= [18,12,30]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar que &lt;br /&gt;
     sum (map (λx. 2*x) xs) = 2 * (sum xs)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma sum_map:&lt;br /&gt;
  &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sum (map (λx. 2*x) []) = 2 * (sum [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume hi: &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;sum (map (λx. 2*x) (a#xs)) = 2 * (sum (a#xs))&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;sum (map (λx. 2*x) (a#xs)) = sum ((2*a)#(map (λx. 2*x) xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 2*a + sum (map (λx. 2*x) xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 2*a + 2 * (sum xs)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = 2*(a + sum xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 2 * (sum (a#xs))&amp;quot;by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar que &lt;br /&gt;
     longitud (map f xs) = longitud xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma long_map:&lt;br /&gt;
  &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
proof (induct xs) &lt;br /&gt;
  show &amp;quot;longitud (map f []) = longitud []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
  show &amp;quot;longitud (map f (x#xs)) = longitud (x#xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;longitud (map f (x#xs)) = longitud ((f x)#(map f xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + longitud (map f xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + longitud xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = longitud (x#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
</feed>