<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/RA2010/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jmuros</id>
	<title>Razonamiento automático (2010-11) - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/RA2010/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jmuros"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php/Especial:Contribuciones/Jmuros"/>
	<updated>2026-07-19T02:51:20Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=257</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=257"/>
		<updated>2011-03-06T11:10:09Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 4ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_4&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::nat) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;sust x y (w#zs) = (if w=x then y#(sust x y zs) else w#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar: &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --Usando la sentencia refute puede obtenerse un contraejemplo fácilmente.&lt;br /&gt;
  --Además, al ejecutarse con la aplicación, ya directamente propone un contraejemplo.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma sust_append_auto: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs @ ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar: &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem rev_sust: &lt;br /&gt;
  &amp;quot;rev (sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::nat) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borra x (w#ys) = (if x=w then ys else (w#(borra x ys)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::nat) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraTodas x (w#ys) = (if x=w then (borraTodas x ys) else (w#(borraTodas x ys)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar: &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem borraTodas_borra_auto: &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem borraTodas_borra:&lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
    &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar: &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: ) (auto simp add: borraTodas_borra_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es falsa.&lt;br /&gt;
El contraejemplo que encuentra Quickcheck es (retocándolo para que no dé&lt;br /&gt;
problemas al exportarlo a Isabelle):&lt;br /&gt;
y = a1&lt;br /&gt;
x = a2&lt;br /&gt;
xs = [a1]&lt;br /&gt;
El contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
x = a1&lt;br /&gt;
xs = [a2]&lt;br /&gt;
y = a2&lt;br /&gt;
Análogamente, el contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
y: a0&lt;br /&gt;
x: a1&lt;br /&gt;
xs: [a0]&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es falsa.&lt;br /&gt;
El contraejemplo que encuentra Quickcheck es (retocándolo para que no dé&lt;br /&gt;
problemas al exportarlo a Isabelle):&lt;br /&gt;
y = a1&lt;br /&gt;
x = a2&lt;br /&gt;
xs = [a1]&lt;br /&gt;
El contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
x = a1&lt;br /&gt;
xs = [a2]&lt;br /&gt;
y = a2&lt;br /&gt;
Análogamente, el contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
y: a0&lt;br /&gt;
x: a1&lt;br /&gt;
xs: [a0]&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
by (induct zs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem sust_borraTodas:&lt;br /&gt;
  &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
proof (induct zs)&lt;br /&gt;
  show &amp;quot;sust x y (borraTodas x []) = borraTodas x []&amp;quot; by auto&lt;br /&gt;
    next&lt;br /&gt;
      show &amp;quot;⋀a zs. sust x y (borraTodas x zs) = borraTodas x zs ⟹&lt;br /&gt;
           sust x y (borraTodas x (a # zs)) = borraTodas x (a # zs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
 Para este ejercicio quickcheck encuentra el siguiente contraejemplo:&lt;br /&gt;
 zs = [0]&lt;br /&gt;
 z = 1&lt;br /&gt;
 y = 1&lt;br /&gt;
 x = 0&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar:&lt;br /&gt;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma borraTodas_append_auto:&lt;br /&gt;
&amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma borraTodas_append: &lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar el teorema: &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: x) (auto simp add: borraTodas_append_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev 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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=256</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=256"/>
		<updated>2011-03-06T10:40:28Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 4ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_4&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::nat) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;sust x y (w#zs) = (if w=x then y#(sust x y zs) else w#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar: &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --Usando la sentencia refute puede obtenerse un contraejemplo fácilmente.&lt;br /&gt;
  --Además, al ejecutarse con la aplicación, ya directamente propone un contraejemplo.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma sust_append_auto: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs @ ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar: &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem rev_sust: &lt;br /&gt;
  &amp;quot;rev (sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::nat) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borra x (w#ys) = (if x=w then ys else (w#(borra x ys)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::nat) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraTodas x (w#ys) = (if x=w then (borraTodas x ys) else (w#(borraTodas x ys)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar: &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem borraTodas_borra_auto: &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem borraTodas_borra:&lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
    &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar: &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: ) (auto simp add: borraTodas_borra_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es falsa.&lt;br /&gt;
El contraejemplo que encuentra Quickcheck es (retocándolo para que no dé&lt;br /&gt;
problemas al exportarlo a Isabelle):&lt;br /&gt;
y = a1&lt;br /&gt;
x = a2&lt;br /&gt;
xs = [a1]&lt;br /&gt;
El contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
x = a1&lt;br /&gt;
xs = [a2]&lt;br /&gt;
y = a2&lt;br /&gt;
Análogamente, el contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
y: a0&lt;br /&gt;
x: a1&lt;br /&gt;
xs: [a0]&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es falsa.&lt;br /&gt;
El contraejemplo que encuentra Quickcheck es (retocándolo para que no dé&lt;br /&gt;
problemas al exportarlo a Isabelle):&lt;br /&gt;
y = a1&lt;br /&gt;
x = a2&lt;br /&gt;
xs = [a1]&lt;br /&gt;
El contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
x = a1&lt;br /&gt;
xs = [a2]&lt;br /&gt;
y = a2&lt;br /&gt;
Análogamente, el contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
y: a0&lt;br /&gt;
x: a1&lt;br /&gt;
xs: [a0]&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
by (induct zs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem sust_borraTodas:&lt;br /&gt;
  &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
 Para este ejercicio quickcheck encuentra el siguiente contraejemplo:&lt;br /&gt;
 zs = [0]&lt;br /&gt;
 z = 1&lt;br /&gt;
 y = 1&lt;br /&gt;
 x = 0&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar:&lt;br /&gt;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma borraTodas_append_auto:&lt;br /&gt;
&amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma borraTodas_append: &lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar el teorema: &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: x) (auto simp add: borraTodas_append_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev 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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=255</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=255"/>
		<updated>2011-03-06T10:35:32Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 4ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_4&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::nat) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;sust x y (w#zs) = (if w=x then y#(sust x y zs) else w#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar: &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --Usando la sentencia refute puede obtenerse un contraejemplo fácilmente.&lt;br /&gt;
  --Además, al ejecutarse con la aplicación, ya directamente propone un contraejemplo.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma sust_append_auto: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs @ ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar: &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem rev_sust: &lt;br /&gt;
  &amp;quot;rev (sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::nat) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borra x (w#ys) = (if x=w then ys else (w#(borra x ys)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::nat) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraTodas x (w#ys) = (if x=w then (borraTodas x ys) else (w#(borraTodas x ys)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar: &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem borraTodas_borra_auto: &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem borraTodas_borra:&lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
    &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar: &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: ) (auto simp add: borraTodas_borra_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es falsa.&lt;br /&gt;
El contraejemplo que encuentra Quickcheck es (retocándolo para que no dé&lt;br /&gt;
problemas al exportarlo a Isabelle):&lt;br /&gt;
y = a1&lt;br /&gt;
x = a2&lt;br /&gt;
xs = [a1]&lt;br /&gt;
El contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
x = a1&lt;br /&gt;
xs = [a2]&lt;br /&gt;
y = a2&lt;br /&gt;
Análogamente, el contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
y: a0&lt;br /&gt;
x: a1&lt;br /&gt;
xs: [a0]&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es falsa.&lt;br /&gt;
El contraejemplo que encuentra Quickcheck es (retocándolo para que no dé&lt;br /&gt;
problemas al exportarlo a Isabelle):&lt;br /&gt;
y = a1&lt;br /&gt;
x = a2&lt;br /&gt;
xs = [a1]&lt;br /&gt;
El contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
x = a1&lt;br /&gt;
xs = [a2]&lt;br /&gt;
y = a2&lt;br /&gt;
Análogamente, el contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
y: a0&lt;br /&gt;
x: a1&lt;br /&gt;
xs: [a0]&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
by (induct zs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem sust_borraTodas:&lt;br /&gt;
  &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar:&lt;br /&gt;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma borraTodas_append_auto:&lt;br /&gt;
&amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma borraTodas_append: &lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar el teorema: &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: x) (auto simp add: borraTodas_append_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev 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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=254</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=254"/>
		<updated>2011-03-06T10:32:09Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 4ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_4&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::nat) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;sust x y (w#zs) = (if w=x then y#(sust x y zs) else w#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar: &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --Usando la sentencia refute puede obtenerse un contraejemplo fácilmente.&lt;br /&gt;
  --Además, al ejecutarse con la aplicación, ya directamente propone un contraejemplo.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma sust_append_auto: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs @ ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar: &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem rev_sust: &lt;br /&gt;
  &amp;quot;rev (sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::nat) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borra x (w#ys) = (if x=w then ys else (w#(borra x ys)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::nat) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraTodas x (w#ys) = (if x=w then (borraTodas x ys) else (w#(borraTodas x ys)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar: &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem borraTodas_borra_auto: &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem borraTodas_borra:&lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
    &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar: &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: ) (auto simp add: borraTodas_borra_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es falsa.&lt;br /&gt;
El contraejemplo que encuentra Quickcheck es (retocándolo para que no dé&lt;br /&gt;
problemas al exportarlo a Isabelle):&lt;br /&gt;
y = a1&lt;br /&gt;
x = a2&lt;br /&gt;
xs = [a1]&lt;br /&gt;
El contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
x = a1&lt;br /&gt;
xs = [a2]&lt;br /&gt;
y = a2&lt;br /&gt;
Análogamente, el contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
y: a0&lt;br /&gt;
x: a1&lt;br /&gt;
xs: [a0]&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es falsa.&lt;br /&gt;
El contraejemplo que encuentra Quickcheck es (retocándolo para que no dé&lt;br /&gt;
problemas al exportarlo a Isabelle):&lt;br /&gt;
y = a1&lt;br /&gt;
x = a2&lt;br /&gt;
xs = [a1]&lt;br /&gt;
El contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
x = a1&lt;br /&gt;
xs = [a2]&lt;br /&gt;
y = a2&lt;br /&gt;
Análogamente, el contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
y: a0&lt;br /&gt;
x: a1&lt;br /&gt;
xs: [a0]&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem sust_borraTodas:&lt;br /&gt;
  &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar:&lt;br /&gt;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma borraTodas_append_auto:&lt;br /&gt;
&amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma borraTodas_append: &lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar el teorema: &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: x) (auto simp add: borraTodas_append_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev 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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=253</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=253"/>
		<updated>2011-03-06T10:06:58Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 4ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_4&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::nat) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;sust x y [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;sust x y (w#zs) = (if w=x then y#(sust x y zs) else w#(sust x y zs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar: &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --Usando la sentencia refute puede obtenerse un contraejemplo fácilmente.&lt;br /&gt;
  --Además, al ejecutarse con la aplicación, ya directamente propone un contraejemplo.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma sust_append_auto: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs @ ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar: &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem rev_sust: &lt;br /&gt;
  &amp;quot;rev (sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::nat) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borra x [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borra x (w#ys) = (if x=w then ys else (w#(borra x ys)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::nat) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraTodas x [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraTodas x (w#ys) = (if x=w then (borraTodas x ys) else (w#(borraTodas x ys)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar: &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem borraTodas_borra_auto: &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem borraTodas_borra:&lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
    &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar: &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: ) (auto simp add: borraTodas_borra_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es falsa.&lt;br /&gt;
El contraejemplo que encuentra Quickcheck es (retocándolo para que no dé&lt;br /&gt;
problemas al exportarlo a Isabelle):&lt;br /&gt;
y = a1&lt;br /&gt;
x = a2&lt;br /&gt;
xs = [a1]&lt;br /&gt;
El contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
x = a1&lt;br /&gt;
xs = [a2]&lt;br /&gt;
y = a2&lt;br /&gt;
Análogamente, el contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
y: a0&lt;br /&gt;
x: a1&lt;br /&gt;
xs: [a0]&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es falsa.&lt;br /&gt;
El contraejemplo que encuentra Quickcheck es (retocándolo para que no dé&lt;br /&gt;
problemas al exportarlo a Isabelle):&lt;br /&gt;
y = a1&lt;br /&gt;
x = a2&lt;br /&gt;
xs = [a1]&lt;br /&gt;
El contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
x = a1&lt;br /&gt;
xs = [a2]&lt;br /&gt;
y = a2&lt;br /&gt;
Análogamente, el contraejemplo que encuentra Refute es idéntico salvo cambio de nombres:&lt;br /&gt;
y: a0&lt;br /&gt;
x: a1&lt;br /&gt;
xs: [a0]&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
&lt;br /&gt;
Usando quickcheck se encuentra el siguiente contraejemplo:&lt;br /&gt;
&lt;br /&gt;
zs = 1&lt;br /&gt;
borraTodas = (λx xa. 1)(0 := (λx. 1)(1 := 0))&lt;br /&gt;
y = 0&lt;br /&gt;
x = 0&lt;br /&gt;
sust = (λx xa xb. - 1)(0 := (λx xa. 0)(0 := (λx. - 1)(0 := 1)))&lt;br /&gt;
&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem sust_borraTodas:&lt;br /&gt;
  &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar:&lt;br /&gt;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma borraTodas_append_auto:&lt;br /&gt;
&amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma borraTodas_append: &lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar el teorema: &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: x) (auto simp add: borraTodas_append_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev 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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_8&amp;diff=252</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_8&amp;diff=252"/>
		<updated>2011-03-05T13:01:19Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
theory Relacion_8&lt;br /&gt;
imports Main Efficient_Nat Relacion_3&lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
section {* Suma y aplanamiento de listas *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     suma :: &amp;quot;nat list ⇒ nat&amp;quot; &lt;br /&gt;
  tal que (suma xs) es la suma de los elementos de la lista de números&lt;br /&gt;
  naturales xs. Por ejemplo, &lt;br /&gt;
     suma [3::nat,2,4] = 9&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec suma :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma [] = 0&amp;quot;&lt;br /&gt;
| &amp;quot;suma (x#xs) = x + suma xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     aplana :: &amp;quot;&amp;#039;a list list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (aplana xss) es la obtenida concatenando los miembros de la &lt;br /&gt;
  lista de listas &amp;quot;xss&amp;quot;. Por ejemplo,&lt;br /&gt;
     aplana [[2,3], [4,5], [7,9]] = [2,3,4,5,7,9]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec aplana :: &amp;quot;&amp;#039;a list list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aplana [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;aplana (xs#xss)  = xs @ aplana xss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar&lt;br /&gt;
     length (aplana xs) = suma (map length xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es verdadera y se puede demostrar&lt;br /&gt;
de forma automática como sigue.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length (aplana xs) = suma (map length xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar&lt;br /&gt;
     suma (xs @ ys) = suma xs + suma ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma (xs @ ys) = suma xs + suma ys&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar&lt;br /&gt;
     aplana (xs @ ys) = (aplana xs) @ (aplana ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (xs @ ys) = (aplana xs) @ (aplana ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar&lt;br /&gt;
     aplana (map rev (rev xs)) = rev (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
El ejercicio debería de comenzar de la siguiente manera:&lt;br /&gt;
*}&lt;br /&gt;
lemma &amp;quot;aplana (map rev (rev xs)) = rev (aplana xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;aplana (map rev (rev [])) = rev (aplana [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix b xs&lt;br /&gt;
  assume HI: &amp;quot;aplana (map rev (rev xs)) = rev (aplana xs)&amp;quot;&lt;br /&gt;
  thus &amp;quot;aplana (map rev (rev (b # xs))) = rev (aplana (b # xs))&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar&lt;br /&gt;
     aplana (rev (map rev xs)) = rev (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar&lt;br /&gt;
     list_all (list_all P) xs = list_all P (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar&lt;br /&gt;
     aplana (rev xs) = aplana xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (rev xs) = aplana xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* El contraejemplo encontrado es xs = [[2], [1, 2]]. Esto tiene&lt;br /&gt;
 sentido ya que el orden influye en la funcion aplanar *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar&lt;br /&gt;
     suma (rev xs) = suma xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
En cambio este ejercicio respecto al anterior tiene sentido que haya&lt;br /&gt;
que demostrarlo, ya que el orden en la suma no afecta, por lo que no se&lt;br /&gt;
encontrará ningún contra ejemplo.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma (rev xs) = suma xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;suma (rev []) = suma []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix b xs&lt;br /&gt;
  assume HI: &amp;quot;suma (rev xs) = suma xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;suma (rev (b # xs)) = suma (b # xs)&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
oops&lt;br /&gt;
text{*&lt;br /&gt;
  En teoria debería de continuarse con una sentencia parecida a la siguiente:&lt;br /&gt;
      have &amp;quot;suma (rev (b # xs)) = suma (rev [b] @ xs)&amp;quot; by auto&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Buscar un predicado P para que se verifique la siguiente &lt;br /&gt;
  propiedad &lt;br /&gt;
     list_all P xs ⟶ length xs ≤ suma xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     algunos (algunos P) xs = algunos P (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Redefinir, usando la función list_all, la función&lt;br /&gt;
  algunos. Llamar la nueva función algunos2 y demostrar que es&lt;br /&gt;
  equivalente a algunos.  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
La siguiente definición se construye utilizando la palabra reservada&lt;br /&gt;
&amp;quot;definition&amp;quot;. Aunque se trata de una función recursiva primitiva no&lt;br /&gt;
es necesario utilizar la palabra reservada &amp;quot;primrec&amp;quot; porque la función&lt;br /&gt;
&amp;quot;list_all&amp;quot; está definida recursivamente o en la cadena de definiciones de&lt;br /&gt;
la que depende, hay una función definida recursivamente.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
definition algunos2 :: &amp;quot;(&amp;#039;a =&amp;gt; bool) =&amp;gt; &amp;#039;a list =&amp;gt; bool&amp;quot; where&lt;br /&gt;
&amp;quot;algunos2 P xs ≡ ¬ list_all (λx. ¬ P x) xs&amp;quot;&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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_8&amp;diff=251</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_8&amp;diff=251"/>
		<updated>2011-03-05T12:58:36Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
theory Relacion_8&lt;br /&gt;
imports Main Efficient_Nat Relacion_3&lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
section {* Suma y aplanamiento de listas *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     suma :: &amp;quot;nat list ⇒ nat&amp;quot; &lt;br /&gt;
  tal que (suma xs) es la suma de los elementos de la lista de números&lt;br /&gt;
  naturales xs. Por ejemplo, &lt;br /&gt;
     suma [3::nat,2,4] = 9&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec suma :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma [] = 0&amp;quot;&lt;br /&gt;
| &amp;quot;suma (x#xs) = x + suma xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     aplana :: &amp;quot;&amp;#039;a list list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (aplana xss) es la obtenida concatenando los miembros de la &lt;br /&gt;
  lista de listas &amp;quot;xss&amp;quot;. Por ejemplo,&lt;br /&gt;
     aplana [[2,3], [4,5], [7,9]] = [2,3,4,5,7,9]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec aplana :: &amp;quot;&amp;#039;a list list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aplana [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;aplana (xs#xss)  = xs @ aplana xss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar&lt;br /&gt;
     length (aplana xs) = suma (map length xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es verdadera y se puede demostrar&lt;br /&gt;
de forma automática como sigue.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length (aplana xs) = suma (map length xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar&lt;br /&gt;
     suma (xs @ ys) = suma xs + suma ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma (xs @ ys) = suma xs + suma ys&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar&lt;br /&gt;
     aplana (xs @ ys) = (aplana xs) @ (aplana ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (xs @ ys) = (aplana xs) @ (aplana ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar&lt;br /&gt;
     aplana (map rev (rev xs)) = rev (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
El ejercicio debería de comenzar de la siguiente manera:&lt;br /&gt;
*}&lt;br /&gt;
lemma &amp;quot;aplana (map rev (rev xs)) = rev (aplana xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;aplana (map rev (rev [])) = rev (aplana [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix b xs&lt;br /&gt;
  assume HI: &amp;quot;aplana (map rev (rev xs)) = rev (aplana xs)&amp;quot;&lt;br /&gt;
  thus &amp;quot;aplana (map rev (rev (b # xs))) = rev (aplana (b # xs))&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar&lt;br /&gt;
     aplana (rev (map rev xs)) = rev (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar&lt;br /&gt;
     list_all (list_all P) xs = list_all P (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar&lt;br /&gt;
     aplana (rev xs) = aplana xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (rev xs) = aplana xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* El contraejemplo encontrado es xs = [[2], [1, 2]]. Esto tiene&lt;br /&gt;
 sentido ya que el orden influye en la funcion aplanar *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar&lt;br /&gt;
     suma (rev xs) = suma xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
En cambio este ejercicio respecto al anterior tiene sentido que haya&lt;br /&gt;
que demostrarlo, ya que el orden en la suma no afecta, por lo que no se&lt;br /&gt;
encontrará ningún contra ejemplo.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Buscar un predicado P para que se verifique la siguiente &lt;br /&gt;
  propiedad &lt;br /&gt;
     list_all P xs ⟶ length xs ≤ suma xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     algunos (algunos P) xs = algunos P (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Redefinir, usando la función list_all, la función&lt;br /&gt;
  algunos. Llamar la nueva función algunos2 y demostrar que es&lt;br /&gt;
  equivalente a algunos.  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
La siguiente definición se construye utilizando la palabra reservada&lt;br /&gt;
&amp;quot;definition&amp;quot;. Aunque se trata de una función recursiva primitiva no&lt;br /&gt;
es necesario utilizar la palabra reservada &amp;quot;primrec&amp;quot; porque la función&lt;br /&gt;
&amp;quot;list_all&amp;quot; está definida recursivamente o en la cadena de definiciones de&lt;br /&gt;
la que depende, hay una función definida recursivamente.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
definition algunos2 :: &amp;quot;(&amp;#039;a =&amp;gt; bool) =&amp;gt; &amp;#039;a list =&amp;gt; bool&amp;quot; where&lt;br /&gt;
&amp;quot;algunos2 P xs ≡ ¬ list_all (λx. ¬ P x) xs&amp;quot;&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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_8&amp;diff=250</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_8&amp;diff=250"/>
		<updated>2011-03-05T12:56:54Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
theory Relacion_8&lt;br /&gt;
imports Main Efficient_Nat Relacion_3&lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
section {* Suma y aplanamiento de listas *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     suma :: &amp;quot;nat list ⇒ nat&amp;quot; &lt;br /&gt;
  tal que (suma xs) es la suma de los elementos de la lista de números&lt;br /&gt;
  naturales xs. Por ejemplo, &lt;br /&gt;
     suma [3::nat,2,4] = 9&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec suma :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma [] = 0&amp;quot;&lt;br /&gt;
| &amp;quot;suma (x#xs) = x + suma xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     aplana :: &amp;quot;&amp;#039;a list list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (aplana xss) es la obtenida concatenando los miembros de la &lt;br /&gt;
  lista de listas &amp;quot;xss&amp;quot;. Por ejemplo,&lt;br /&gt;
     aplana [[2,3], [4,5], [7,9]] = [2,3,4,5,7,9]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec aplana :: &amp;quot;&amp;#039;a list list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aplana [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;aplana (xs#xss)  = xs @ aplana xss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar&lt;br /&gt;
     length (aplana xs) = suma (map length xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es verdadera y se puede demostrar&lt;br /&gt;
de forma automática como sigue.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length (aplana xs) = suma (map length xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar&lt;br /&gt;
     suma (xs @ ys) = suma xs + suma ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma (xs @ ys) = suma xs + suma ys&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar&lt;br /&gt;
     aplana (xs @ ys) = (aplana xs) @ (aplana ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (xs @ ys) = (aplana xs) @ (aplana ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar&lt;br /&gt;
     aplana (map rev (rev xs)) = rev (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
El ejercicio debería de comenzar de la siguiente manera:&lt;br /&gt;
*}&lt;br /&gt;
lemma &amp;quot;aplana (map rev (rev xs)) = rev (aplana xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;aplana (map rev (rev [])) = rev (aplana [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix b xs&lt;br /&gt;
  assume HI: &amp;quot;aplana (map rev (rev xs)) = rev (aplana xs)&amp;quot;&lt;br /&gt;
  thus &amp;quot;aplana (map rev (rev (b # xs))) = rev (aplana (b # xs))&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar&lt;br /&gt;
     aplana (rev (map rev xs)) = rev (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar&lt;br /&gt;
     list_all (list_all P) xs = list_all P (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar&lt;br /&gt;
     aplana (rev xs) = aplana xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (rev xs) = aplana xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* El contraejemplo encontrado es xs = [[2], [1, 2]]. Esto tiene&lt;br /&gt;
 sentido ya que el orden influye en la funcion aplanar *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar&lt;br /&gt;
     suma (rev xs) = suma xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Buscar un predicado P para que se verifique la siguiente &lt;br /&gt;
  propiedad &lt;br /&gt;
     list_all P xs ⟶ length xs ≤ suma xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     algunos (algunos P) xs = algunos P (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Redefinir, usando la función list_all, la función&lt;br /&gt;
  algunos. Llamar la nueva función algunos2 y demostrar que es&lt;br /&gt;
  equivalente a algunos.  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
La siguiente definición se construye utilizando la palabra reservada&lt;br /&gt;
&amp;quot;definition&amp;quot;. Aunque se trata de una función recursiva primitiva no&lt;br /&gt;
es necesario utilizar la palabra reservada &amp;quot;primrec&amp;quot; porque la función&lt;br /&gt;
&amp;quot;list_all&amp;quot; está definida recursivamente o en la cadena de definiciones de&lt;br /&gt;
la que depende, hay una función definida recursivamente.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
definition algunos2 :: &amp;quot;(&amp;#039;a =&amp;gt; bool) =&amp;gt; &amp;#039;a list =&amp;gt; bool&amp;quot; where&lt;br /&gt;
&amp;quot;algunos2 P xs ≡ ¬ list_all (λx. ¬ P x) xs&amp;quot;&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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_8&amp;diff=249</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_8&amp;diff=249"/>
		<updated>2011-03-05T11:35:52Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
theory Relacion_8&lt;br /&gt;
imports Main Efficient_Nat Relacion_3&lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
section {* Suma y aplanamiento de listas *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     suma :: &amp;quot;nat list ⇒ nat&amp;quot; &lt;br /&gt;
  tal que (suma xs) es la suma de los elementos de la lista de números&lt;br /&gt;
  naturales xs. Por ejemplo, &lt;br /&gt;
     suma [3::nat,2,4] = 9&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec suma :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma [] = 0&amp;quot;&lt;br /&gt;
| &amp;quot;suma (x#xs) = x + suma xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     aplana :: &amp;quot;&amp;#039;a list list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (aplana xss) es la obtenida concatenando los miembros de la &lt;br /&gt;
  lista de listas &amp;quot;xss&amp;quot;. Por ejemplo,&lt;br /&gt;
     aplana [[2,3], [4,5], [7,9]] = [2,3,4,5,7,9]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec aplana :: &amp;quot;&amp;#039;a list list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aplana [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;aplana (xs#xss)  = xs @ aplana xss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar&lt;br /&gt;
     length (aplana xs) = suma (map length xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es verdadera y se puede demostrar&lt;br /&gt;
de forma automática como sigue.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length (aplana xs) = suma (map length xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar&lt;br /&gt;
     suma (xs @ ys) = suma xs + suma ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma (xs @ ys) = suma xs + suma ys&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar&lt;br /&gt;
     aplana (xs @ ys) = (aplana xs) @ (aplana ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (xs @ ys) = (aplana xs) @ (aplana ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar&lt;br /&gt;
     aplana (map rev (rev xs)) = rev (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar&lt;br /&gt;
     aplana (rev (map rev xs)) = rev (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar&lt;br /&gt;
     list_all (list_all P) xs = list_all P (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar&lt;br /&gt;
     aplana (rev xs) = aplana xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (rev xs) = aplana xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* El contraejemplo encontrado es xs = [[2], [1, 2]]. Esto tiene&lt;br /&gt;
 sentido ya que el orden influye en la funcion aplanar *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar&lt;br /&gt;
     suma (rev xs) = suma xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Buscar un predicado P para que se verifique la siguiente &lt;br /&gt;
  propiedad &lt;br /&gt;
     list_all P xs ⟶ length xs ≤ suma xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     algunos (algunos P) xs = algunos P (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Redefinir, usando la función list_all, la función&lt;br /&gt;
  algunos. Llamar la nueva función algunos2 y demostrar que es&lt;br /&gt;
  equivalente a algunos.  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
La siguiente definición se construye utilizando la palabra reservada&lt;br /&gt;
&amp;quot;definition&amp;quot;. Aunque se trata de una función recursiva primitiva no&lt;br /&gt;
es necesario utilizar la palabra reservada &amp;quot;primrec&amp;quot; porque la función&lt;br /&gt;
&amp;quot;list_all&amp;quot; está definida recursivamente o en la cadena de definiciones de&lt;br /&gt;
la que depende, hay una función definida recursivamente.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
definition algunos2 :: &amp;quot;(&amp;#039;a =&amp;gt; bool) =&amp;gt; &amp;#039;a list =&amp;gt; bool&amp;quot; where&lt;br /&gt;
&amp;quot;algunos2 P xs ≡ ¬ list_all (λx. ¬ P x) xs&amp;quot;&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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_8&amp;diff=248</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_8&amp;diff=248"/>
		<updated>2011-03-05T11:34:13Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
theory Relacion_8&lt;br /&gt;
imports Main Efficient_Nat Relacion_3&lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
section {* Suma y aplanamiento de listas *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     suma :: &amp;quot;nat list ⇒ nat&amp;quot; &lt;br /&gt;
  tal que (suma xs) es la suma de los elementos de la lista de números&lt;br /&gt;
  naturales xs. Por ejemplo, &lt;br /&gt;
     suma [3::nat,2,4] = 9&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec suma :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma [] = 0&amp;quot;&lt;br /&gt;
| &amp;quot;suma (x#xs) = x + suma xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     aplana :: &amp;quot;&amp;#039;a list list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (aplana xss) es la obtenida concatenando los miembros de la &lt;br /&gt;
  lista de listas &amp;quot;xss&amp;quot;. Por ejemplo,&lt;br /&gt;
     aplana [[2,3], [4,5], [7,9]] = [2,3,4,5,7,9]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec aplana :: &amp;quot;&amp;#039;a list list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aplana [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;aplana (xs#xss)  = xs @ aplana xss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar&lt;br /&gt;
     length (aplana xs) = suma (map length xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
La igualdad propuesta es verdadera y se puede demostrar&lt;br /&gt;
de forma automática como sigue.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length (aplana xs) = suma (map length xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar&lt;br /&gt;
     suma (xs @ ys) = suma xs + suma ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma (xs @ ys) = suma xs + suma ys&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar&lt;br /&gt;
     aplana (xs @ ys) = (aplana xs) @ (aplana ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (xs @ ys) = (aplana xs) @ (aplana ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar&lt;br /&gt;
     aplana (map rev (rev xs)) = rev (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar&lt;br /&gt;
     aplana (rev (map rev xs)) = rev (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar&lt;br /&gt;
     list_all (list_all P) xs = list_all P (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar&lt;br /&gt;
     aplana (rev xs) = aplana xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (rev xs) = aplana xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
&lt;br /&gt;
text {* El contraejemplo encontrado es xs = [[2], [1, 2]]. Esto tiene&lt;br /&gt;
 sentido ya que el orden influye en la funcion aplanar *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar&lt;br /&gt;
     suma (rev xs) = suma xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Buscar un predicado P para que se verifique la siguiente &lt;br /&gt;
  propiedad &lt;br /&gt;
     list_all P xs ⟶ length xs ≤ suma xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     algunos (algunos P) xs = algunos P (aplana xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Redefinir, usando la función list_all, la función&lt;br /&gt;
  algunos. Llamar la nueva función algunos2 y demostrar que es&lt;br /&gt;
  equivalente a algunos.  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
La siguiente definición se construye utilizando la palabra reservada&lt;br /&gt;
&amp;quot;definition&amp;quot;. Aunque se trata de una función recursiva primitiva no&lt;br /&gt;
es necesario utilizar la palabra reservada &amp;quot;primrec&amp;quot; porque la función&lt;br /&gt;
&amp;quot;list_all&amp;quot; está definida recursivamente o en la cadena de definiciones de&lt;br /&gt;
la que depende, hay una función definida recursivamente.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
definition algunos2 :: &amp;quot;(&amp;#039;a =&amp;gt; bool) =&amp;gt; &amp;#039;a list =&amp;gt; bool&amp;quot; where&lt;br /&gt;
&amp;quot;algunos2 P xs ≡ ¬ list_all (λx. ¬ P x) xs&amp;quot;&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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_5&amp;diff=180</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_5&amp;diff=180"/>
		<updated>2011-02-16T21:15:18Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 5ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_5&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Menor posición válida *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     menorValida :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ nat&amp;quot;&lt;br /&gt;
  tal que (menorValida p xs) es el índice del primer elemento de una&lt;br /&gt;
  lista xs que satisface el predicado  p y es la longitud de xs si&lt;br /&gt;
  ningún elemento satisface el predicado p. Por ejemplo, &lt;br /&gt;
     menorValida (λx. 4&amp;lt;x) [1::nat, 3, 5, 3, 1]     = 2&lt;br /&gt;
     menorValida (λx. 6&amp;lt;x) [1::nat, 3, 5, 3, 1]     = 5&lt;br /&gt;
     menorValida (λx. 1&amp;lt;length x) [[], [1, 2], [3]] = 1&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec menorValida :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;menorValida P [] = 0&amp;quot; &lt;br /&gt;
  | &amp;quot;menorValida P (x#xs) = (if P x then 0 else ((menorValida P xs)+1))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que menorValida devuelve la longitud de la&lt;br /&gt;
  lista syss ningún elemento satisface el predicado dado.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;menorValida (λx. 6&amp;lt;x) [1::nat, 3, 5, 3, 1] = 5&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar si n es el valor de (menorValida P xs),&lt;br /&gt;
  entonces ninguno de los primeros n elementos de la lista xs verifica&lt;br /&gt;
  la propiedad P. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
{* Una posible opcion inicial es poner un ejemplo en el que no se cumpla&lt;br /&gt;
e intentar sacar un contraejemplo&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;menorValida (λx. 4&amp;lt;x) [1::nat, 2, 3, 4, 7] = 5&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
{* Duda: Utilizando la palabra clave &amp;quot;quickcheck&amp;quot; el sistema avisa de que&lt;br /&gt;
ha encontrado un contraejemplo, pero no muestra nada, ¿ha encontrado&lt;br /&gt;
realmente un contraejemplo? *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. ¿Cómo se puede relacionar &lt;br /&gt;
    &amp;quot;menorValida (λ x. P x ∨ Q x) xs&amp;quot; &lt;br /&gt;
  con &lt;br /&gt;
    &amp;quot;menorValida P xs&amp;quot; y &amp;quot;menorValida Q xs&amp;quot;? &lt;br /&gt;
  ¿Se puede decir algo parecido con la conjunción de P y Q?  &lt;br /&gt;
  Prueba tus conjeturas.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La relación es la siguiente: La menor posición de los elementos que&lt;br /&gt;
  verifican la propiedad &amp;quot;P ∨ Q&amp;quot; es el mínimo de la menor posición de&lt;br /&gt;
  los elementos que verifican P y de la menor posición de los elementos&lt;br /&gt;
  que verifican Q.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Si P implica Q, ¿qué relación puede deducirse entre &lt;br /&gt;
  &amp;quot;menorValida P xs&amp;quot; y &amp;quot;menorValida Q xs&amp;quot;?&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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jmuros&amp;diff=175</id>
		<title>Usuario:Jmuros</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jmuros&amp;diff=175"/>
		<updated>2011-02-15T21:51:38Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Jesús Muros Ponce, curso de Razonamiento Automático.&lt;br /&gt;
Email: jmuros@gmail.com.&lt;/div&gt;</summary>
		<author><name>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_5&amp;diff=174</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_5&amp;diff=174"/>
		<updated>2011-02-15T21:45:12Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 5ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_5&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Menor posición válida *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     menorValida :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ nat&amp;quot;&lt;br /&gt;
  tal que (menorValida p xs) es el índice del primer elemento de una&lt;br /&gt;
  lista xs que satisface el predicado  p y es la longitud de xs si&lt;br /&gt;
  ningún elemento satisface el predicado p. Por ejemplo, &lt;br /&gt;
     menorValida (λx. 4&amp;lt;x) [1::nat, 3, 5, 3, 1]     = 2&lt;br /&gt;
     menorValida (λx. 6&amp;lt;x) [1::nat, 3, 5, 3, 1]     = 5&lt;br /&gt;
     menorValida (λx. 1&amp;lt;length x) [[], [1, 2], [3]] = 1&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec menorValida :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;menorValida P [] = 0&amp;quot; &lt;br /&gt;
  | &amp;quot;menorValida P (x#xs) = (if P x then 0 else ((menorValida P xs)+1))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que menorValida devuelve la longitud de la&lt;br /&gt;
  lista syss ningún elemento satisface el predicado dado.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;menorValida (λx. 6&amp;lt;x) [1::nat, 3, 5, 3, 1] = 5&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar si n es el valor de (menorValida P xs),&lt;br /&gt;
  entonces ninguno de los primeros n elementos de la lista xs verifica&lt;br /&gt;
  la propiedad P. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
{* Una posible opcion inicial es poner un ejemplo en el que no se cumpla&lt;br /&gt;
e intentar sacar un contraejemplo&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;menorValida (λx. 4&amp;lt;x) [1::nat, 2, 3, 4, 7] = 5&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. ¿Cómo se puede relacionar &lt;br /&gt;
    &amp;quot;menorValida (λ x. P x ∨ Q x) xs&amp;quot; &lt;br /&gt;
  con &lt;br /&gt;
    &amp;quot;menorValida P xs&amp;quot; y &amp;quot;menorValida Q xs&amp;quot;? &lt;br /&gt;
  ¿Se puede decir algo parecido con la conjunción de P y Q?  &lt;br /&gt;
  Prueba tus conjeturas.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La relación es la siguiente: La menor posición de los elementos que&lt;br /&gt;
  verifican la propiedad &amp;quot;P ∨ Q&amp;quot; es el mínimo de la menor posición de&lt;br /&gt;
  los elementos que verifican P y de la menor posición de los elementos&lt;br /&gt;
  que verifican Q.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Si P implica Q, ¿qué relación puede deducirse entre &lt;br /&gt;
  &amp;quot;menorValida P xs&amp;quot; y &amp;quot;menorValida Q xs&amp;quot;?&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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_2&amp;diff=149</id>
		<title>Relación 2</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_2&amp;diff=149"/>
		<updated>2011-02-14T21:56:10Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 2ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_2&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional y de la lógica&lt;br /&gt;
  de predicados (allI, allE, exI y exE). &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(∃x.∀y. P x y) ⟶ (∀y.∃x. P x y)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;∃x. ∀y. P x y&amp;quot;&lt;br /&gt;
  show &amp;quot;∀y. ∃x. P x y&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    from 1 obtain &amp;quot;x&amp;quot; where 2: &amp;quot;∀y. P x y&amp;quot; by (rule exE)&lt;br /&gt;
    fix y&lt;br /&gt;
    from 2 have 3: &amp;quot;P x y&amp;quot; by (rule allE)&lt;br /&gt;
    from 3 show 4: &amp;quot;∃x. P x y&amp;quot; by (rule exI)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(∀x. P x ⟶ Q) = ((∃x. P x) ⟶ Q)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
 { assume 1: &amp;quot;∀x. P x ⟶ Q&amp;quot;&lt;br /&gt;
   show &amp;quot;(∃x. P x) ⟶ Q&amp;quot;&lt;br /&gt;
   proof&lt;br /&gt;
     assume &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
     then obtain a where &amp;quot;P a&amp;quot; by (rule exE)&lt;br /&gt;
     have &amp;quot;P a ⟶ Q&amp;quot; using 1 by (rule allE)&lt;br /&gt;
     thus &amp;quot;Q&amp;quot; using `P a` by (rule mp)&lt;br /&gt;
   qed }&lt;br /&gt;
next&lt;br /&gt;
 { assume 2: &amp;quot;(∃x. P x) ⟶ Q&amp;quot;&lt;br /&gt;
   show &amp;quot;∀x. P x ⟶ Q&amp;quot;&lt;br /&gt;
   proof&lt;br /&gt;
     fix a&lt;br /&gt;
     show &amp;quot;P a ⟶ Q&amp;quot;&lt;br /&gt;
     proof&lt;br /&gt;
       assume &amp;quot;P a&amp;quot;&lt;br /&gt;
       hence 3: &amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
       from 2 and 3 show &amp;quot;Q&amp;quot; by (rule mp)&lt;br /&gt;
     qed&lt;br /&gt;
   qed }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((∀ x. P x) ∧ (∀ x. Q x)) = (∀ x. (P x ∧ Q x))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  { assume 1: &amp;quot;(∀ x. P x) ∧ (∀ x. Q x)&amp;quot;&lt;br /&gt;
    show &amp;quot;∀ x. (P x ∧ Q x)&amp;quot;&lt;br /&gt;
    proof (rule allI)&lt;br /&gt;
      from 1 have 2: &amp;quot;∀ x. P x&amp;quot; by (rule conjE)&lt;br /&gt;
      from 1 have 3: &amp;quot;∀ x. Q x&amp;quot; by (rule conjE)&lt;br /&gt;
      fix a&lt;br /&gt;
      from 2 have 4: &amp;quot;P a&amp;quot; by (rule allE)&lt;br /&gt;
      from 3 have 5: &amp;quot;Q a&amp;quot; by (rule allE)&lt;br /&gt;
      from 4 and 5 show 6: &amp;quot;(P a) ∧ (Q a)&amp;quot; by (rule conjI)&lt;br /&gt;
    qed }&lt;br /&gt;
next&lt;br /&gt;
  { assume 7: &amp;quot;∀ x. (P x ∧ Q x)&amp;quot;&lt;br /&gt;
    show &amp;quot;(∀ x. P x) ∧ (∀ x. Q x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      show &amp;quot;(∀ x. P x)&amp;quot;&lt;br /&gt;
      proof (rule allI)&lt;br /&gt;
        fix a&lt;br /&gt;
        from 7 have 8: &amp;quot;P a ∧ Q a&amp;quot; by (rule allE)&lt;br /&gt;
        from 8 show &amp;quot;P a&amp;quot; by (rule conjE)&lt;br /&gt;
      qed&lt;br /&gt;
    next&lt;br /&gt;
      show &amp;quot;(∀ x. Q x)&amp;quot;&lt;br /&gt;
      proof (rule allI)&lt;br /&gt;
        fix a&lt;br /&gt;
        from 7 have 9: &amp;quot;P a ∧ Q a&amp;quot; by (rule allE)&lt;br /&gt;
        from 9 show &amp;quot;Q a&amp;quot; by (rule conjE)&lt;br /&gt;
      qed &lt;br /&gt;
    qed }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((∀ x. P x) ∨ (∀ x. Q x)) = (∀ x. (P x ∨ Q x))&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Esta fórmula de la lógica de predicados es falsa. La implicación de&lt;br /&gt;
  izquierda a derecha sí es cierta y a continuación la probamos:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((∀ x. P x) ∨ (∀ x. Q x)) ⟶ (∀ x. (P x ∨ Q x))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;(∀ x. P x) ∨ (∀ x. Q x)&amp;quot;&lt;br /&gt;
  show &amp;quot;∀ x. (P x ∨ Q x)&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix x&lt;br /&gt;
    note 1&lt;br /&gt;
    moreover{&lt;br /&gt;
      assume 11: &amp;quot;∀ x. P x&amp;quot;   &lt;br /&gt;
      from 11 have 111: &amp;quot;P x&amp;quot; by (rule allE)&lt;br /&gt;
      from 111 have &amp;quot;P x ∨ Q x&amp;quot; by (rule disjI1)}&lt;br /&gt;
    moreover{  &lt;br /&gt;
      assume 12: &amp;quot;∀ x. Q x&amp;quot;&lt;br /&gt;
      from 12 have 121: &amp;quot;Q x&amp;quot; by (rule allE)&lt;br /&gt;
      from 121 have &amp;quot;P x ∨ Q x&amp;quot; by (rule disjI2)}&lt;br /&gt;
    ultimately show &amp;quot;(P x ∨ Q x)&amp;quot; by (rule disjE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  La implicación de derecha a izquierda es falsa y a continuación&lt;br /&gt;
  construimos un contraejemplo. Supongamos un modelo en el que fuese&lt;br /&gt;
  verdadera: &lt;br /&gt;
    (∀ x. (P x ∨ Q x)) ∧ (∃x. ¬P x ) ∧ (∃x. ¬Q x),&lt;br /&gt;
  lo cual equivale a &lt;br /&gt;
    (∀ x. (P x ∨ Q x)) ∧ ¬(∀ x. P x ) ∧ ¬(∀ x. Q x)&lt;br /&gt;
  y esto es contradictorio con &lt;br /&gt;
    (∀ x. P x) ∨ (∀ x. Q x). &lt;br /&gt;
  Un ejemplo en lenguaje natural que ilustra esto es el siguiente: todos &lt;br /&gt;
  los números reales son algebraicos o trascendentes, pero de ello no&lt;br /&gt;
  podemos concluir que o bien todos los números reales son algebraicos o bien todos los&lt;br /&gt;
  números reales son trascendentes.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Comentario de J.A. Alonso: ¿Cómo se calcula un contraejemplo con Isabelle?&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((∃ x. P x) ∨ (∃ x. Q x)) = (∃ x. (P x ∨ Q x))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  {assume 1:&amp;quot;((∃ x. P x) ∨ (∃ x. Q x))&amp;quot;&lt;br /&gt;
   show &amp;quot;(∃ x. (P x ∨ Q x))&amp;quot;&lt;br /&gt;
   proof -&lt;br /&gt;
     note 1&lt;br /&gt;
     moreover&lt;br /&gt;
     { assume 2: &amp;quot;(∃ x. P x)&amp;quot;&lt;br /&gt;
       obtain a where 3: &amp;quot;P a&amp;quot; using 2 by (rule exE)&lt;br /&gt;
       from 3 have 4: &amp;quot;P a ∨ Q a&amp;quot; .. &lt;br /&gt;
       from 4 have &amp;quot;(∃ x. (P x ∨ Q x))&amp;quot; by (rule exI) }&lt;br /&gt;
     moreover&lt;br /&gt;
     { assume 2: &amp;quot;(∃ x. Q x)&amp;quot;&lt;br /&gt;
       obtain a where 3: &amp;quot;Q a&amp;quot; using 2 by (rule exE)&lt;br /&gt;
       from 3 have 4: &amp;quot;P a ∨ Q a&amp;quot; .. &lt;br /&gt;
       from 4 have &amp;quot;(∃ x. (P x ∨ Q x))&amp;quot; by (rule exI) }&lt;br /&gt;
     ultimately show &amp;quot;(∃ x. (P x ∨ Q x))&amp;quot; by (rule disjE)  &lt;br /&gt;
   qed}&lt;br /&gt;
next&lt;br /&gt;
  {assume 1:&amp;quot;(∃ x. (P x ∨ Q x))&amp;quot;&lt;br /&gt;
   obtain a where 2: &amp;quot;P a ∨ Q a&amp;quot; using 1 by (rule exE)&lt;br /&gt;
   show &amp;quot;((∃ x. P x) ∨ (∃ x. Q x))&amp;quot; using 2&lt;br /&gt;
   proof &lt;br /&gt;
     { assume 3: &amp;quot;P a&amp;quot;&lt;br /&gt;
       from 3 have 4: &amp;quot;(∃ x. P x)&amp;quot; by (rule exI)&lt;br /&gt;
       from 4 show &amp;quot;((∃ x. P x) ∨ (∃ x. Q x))&amp;quot; .. }&lt;br /&gt;
     { assume 3: &amp;quot;Q a&amp;quot;&lt;br /&gt;
       from 3 have 4: &amp;quot;(∃ x. Q x)&amp;quot; by (rule exI)&lt;br /&gt;
       from 4 show &amp;quot;((∃ x. P x) ∨ (∃ x. Q x))&amp;quot; .. }&lt;br /&gt;
   qed }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Esta fórmula de la lógica de predicados es falsa y a continuación&lt;br /&gt;
  construimos un contraejemplo. Supongamos un modelo en el que fuese verdadera:&lt;br /&gt;
    (∀x.∃y. P x y) ∧ (∀x. P x x) ∧ (∀x.∀y. (¬(x = y) ⟶ ¬(P y x))) ∧ (∃x.∃y. (¬(x = y))) &lt;br /&gt;
  y esto es contradictorio con &lt;br /&gt;
    (∃y. ∀x. P x y).&lt;br /&gt;
  Si interpretamos P como &amp;lt;&amp;lt;tener exactamente los mismos padres y los&lt;br /&gt;
  mismos hermanos que&amp;gt;&amp;gt; es obvio que la implicación es falsa. Un&lt;br /&gt;
  contraejemplo más conocido se obtiene interpretando P como la relación&lt;br /&gt;
  &amp;lt;&amp;lt;menor o igual que&amp;gt;&amp;gt; sobre los números reales, de modo que el&lt;br /&gt;
  antecedente indicaría que dichos números no están acotados&lt;br /&gt;
  superiormente, mientras que el consecuente indicaría que el conjunto&lt;br /&gt;
  de los reales tiene al menos una cota superior.&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Comentario de J.A. Alonso: ¿Cómo se calcula un contraejemplo con Isabelle?&lt;br /&gt;
 &lt;br /&gt;
 Simplemente ejecutando un lema o teorema para el cual se pueda encontrar un&lt;br /&gt;
 contraejemplo, isabelle automáticamente te lo mostrará. Para que el sistema&lt;br /&gt;
 calcule un contraejemplo directamente también es posible utilizar la palabra&lt;br /&gt;
 reservada &amp;quot;refute&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La forma más corta y más automática es la que sigue&amp;quot;&lt;br /&gt;
lemma &amp;quot;(¬ (∀ x. P x)) = (∃ x. ¬ P x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=119</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=119"/>
		<updated>2011-02-13T21:43:50Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 4ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_4&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::nat) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar: &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
--Usando la sentencia refute puede obtenerse un contraejemplo fácilmente.&lt;br /&gt;
 Además, al ejecutarse con la aplicación, ya directamente propone un contraejemplo.&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma sust_append_auto: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs @ ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar: &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem rev_sust: &lt;br /&gt;
  &amp;quot;rev (sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::nat) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::nat) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar: &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem borraTodas_borra:&lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
    &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar: &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem sust_borraTodas:&lt;br /&gt;
  &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar:&lt;br /&gt;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma borraTodas_append: &lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar el teorema: &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev 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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=118</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_4&amp;diff=118"/>
		<updated>2011-02-13T21:39:07Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 4ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_4&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Sustitución, inversión y eliminación *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     sust :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (sust x y zs) es la lista obtenida sustituyendo cada&lt;br /&gt;
  occurrencia de x por y en la lista zs. Por ejemplo,&lt;br /&gt;
     sust (1::nat) 2 [1,2,3,4,1,2,3,4] = [2,2,3,4,2,2,3,4]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar: &lt;br /&gt;
     sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
  ---------------------------------------------------------------------  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma sust_append_auto: &lt;br /&gt;
  &amp;quot;sust x y (xs@ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma sust_append: &lt;br /&gt;
  &amp;quot;sust x y (xs @ ys) = (sust x y xs)@(sust x y ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar: &lt;br /&gt;
     rev (sust x y zs) = sust x y (rev zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev(sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem rev_sust: &lt;br /&gt;
  &amp;quot;rev (sust x y zs) = sust x y (rev zs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
     sust x y (sust u v zs) = sust u v (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (sust u v zs) = sust u v (sust x y zs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar:&lt;br /&gt;
     sust y z (sust x y zs) = sust x z zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust y z (sust x y zs) = sust x z zs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     borra :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borra x ys) es la lista obtenida borrando la primera&lt;br /&gt;
  ocurrencia del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borra (2::nat) [1,2,3,2] = [1,3,2]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borra es equivalente a la predefinida remove1. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     borraTodas :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (borraTodas x ys) es la lista obtenida borrando todas las&lt;br /&gt;
  ocurrencias del elemento x en la lista ys. Por ejemplo,&lt;br /&gt;
     borraTodas (2::nat) [1,2,3,2] = [1,3]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar: &lt;br /&gt;
     borra x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borraTodas x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borraTodas x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar:&lt;br /&gt;
     borraTodas x (borra x xs) = borraTodas x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem borraTodas_borra:&lt;br /&gt;
  &amp;quot;borraTodas x (borra x xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
    &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar o refutar: &lt;br /&gt;
     borra x (borra y xs) = borra y (borra x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borra x (borra y xs) = borra y (borra x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (borra y xs) = borra y (borraTodas x xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;borraTodas x (borra y xs) = borra y (borraTodas x xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar:&lt;br /&gt;
     borra y (sust x y xs) = borra x xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borra y (sust x y xs) = borra x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;borraTodas y (sust x y xs) = borraTodas x xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas x zs) = borraTodas x zs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem sust_borraTodas:&lt;br /&gt;
  &amp;quot;sust x y (borraTodas x zs) = borraTodas x zs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar:&lt;br /&gt;
     sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;sust x y (borraTodas z zs) = borraTodas z (sust x y zs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar:&lt;br /&gt;
     rev (borra x xs) = borra x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;rev (borra x xs) = borra x (rev xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar el teorema: &lt;br /&gt;
     borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma borraTodas_append: &lt;br /&gt;
  &amp;quot;borraTodas x (xs@ys) = (borraTodas x xs)@(borraTodas x ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar el teorema: &lt;br /&gt;
     rev (borraTodas x xs) = borraTodas x (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem &amp;quot;rev (borraTodas x xs) = borraTodas x (rev 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>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=117</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=117"/>
		<updated>2011-02-13T21:10:26Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 1ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_1&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Demostrar los siguientes lemas usando sólo las reglas básicas de&lt;br /&gt;
  deducción natural de la lógica proposicional.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma I: &amp;quot;A ⟶ A&amp;quot;&lt;br /&gt;
by (rule imp_refl)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se puede hacer automáticamente&amp;quot;&lt;br /&gt;
lemma I_d2: &amp;quot;A ⟶  A&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Otra forma (más explicita)&amp;quot;&lt;br /&gt;
lemma I_d3: &amp;quot;A ⟶ A&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;A&amp;quot;&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1:&amp;quot;A ∧ B&amp;quot; &lt;br /&gt;
  shows  &amp;quot;B ∧ A&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  from 1 have 2:&amp;quot;A&amp;quot; by (rule conjunct1)&lt;br /&gt;
  from 1 have 3:&amp;quot;B&amp;quot; by (rule conjunct2)&lt;br /&gt;
  from 3 2 show &amp;quot;B ∧ A&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;El ejercicio anterior hecho de un modo&lt;br /&gt;
automático (dado que no es posible hacerlo&lt;br /&gt;
por auto, es un buen candidato a que lo&lt;br /&gt;
resuelvan otros demostradores automáticos&lt;br /&gt;
proposicionales)&amp;quot;&lt;br /&gt;
lemma&lt;br /&gt;
  assumes 1:&amp;quot;A ∧ B&amp;quot; &lt;br /&gt;
  shows  &amp;quot;B ∧ A&amp;quot; &lt;br /&gt;
by (metis 1) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ∧ B ⟶ A ∨ B&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;A ∧ B&amp;quot;&lt;br /&gt;
  hence &amp;quot;A&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;A ∨ B&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;El anterior lemma&lt;br /&gt;
demostrado de forma aún más breve&amp;quot;&lt;br /&gt;
lemma &amp;quot;A ∧ B ⟶ A ∨ B&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
-- Otra version&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ∧ B ⟶ A ∨ B&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1: &amp;quot;A ∧ B&amp;quot;&lt;br /&gt;
  from 1 have 2: &amp;quot;A&amp;quot; by (rule conjunct1)&lt;br /&gt;
  from 2 show &amp;quot;A ∨ B&amp;quot; by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes 1:&amp;quot;(A ∨ B) ∨ C&amp;quot;&lt;br /&gt;
  shows &amp;quot;A ∨ ( B ∨ C)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
note 1&lt;br /&gt;
 moreover&lt;br /&gt;
 { assume 2: &amp;quot;C&amp;quot;&lt;br /&gt;
   from 2 have 3:&amp;quot;B ∨ C&amp;quot; by (rule disjI2) &lt;br /&gt;
   from 3 have &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI2)}&lt;br /&gt;
 moreover&lt;br /&gt;
 { assume 4: &amp;quot;A ∨ B&amp;quot;&lt;br /&gt;
   from 4 have &amp;quot;(A ∨ B) ∨ C&amp;quot; by (rule disjI1) }&lt;br /&gt;
ultimately show &amp;quot;A ∨ (B ∨ C) &amp;quot; by (simp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Otra forma (más explícita)&lt;br /&gt;
lemma version2: &amp;quot;(A ∨ B) ∨ C ⟶ A ∨ (B ∨ C)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1: &amp;quot;(A ∨ B) ∨ C&amp;quot;&lt;br /&gt;
  show &amp;quot;A ∨ (B ∨ C)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    note 1&lt;br /&gt;
    moreover{&lt;br /&gt;
      assume 2: &amp;quot;A ∨ B&amp;quot;&lt;br /&gt;
      have &amp;quot;A ∨ (B ∨ C)&amp;quot;&lt;br /&gt;
        proof -&lt;br /&gt;
          note 2&lt;br /&gt;
          moreover{&lt;br /&gt;
            assume 3: &amp;quot;A&amp;quot;&lt;br /&gt;
            from 3 have 4:&amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI1)&lt;br /&gt;
          }&lt;br /&gt;
          moreover{&lt;br /&gt;
            assume 5:&amp;quot;B&amp;quot;&lt;br /&gt;
            from 5 have 6: &amp;quot;B ∨ C&amp;quot; by (rule disjI1)&lt;br /&gt;
            from 6 have 7: &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI2)&lt;br /&gt;
          }&lt;br /&gt;
          ultimately show &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjE)&lt;br /&gt;
        qed&lt;br /&gt;
      }&lt;br /&gt;
      moreover{&lt;br /&gt;
        assume 8: &amp;quot;C&amp;quot;&lt;br /&gt;
        from 8 have 9: &amp;quot;B ∨ C&amp;quot; by (rule disjI2)&lt;br /&gt;
        from 9 have &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI2)&lt;br /&gt;
      }&lt;br /&gt;
      ultimately show &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjE)&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- La versión anterior de la propiedad asociativa de la&lt;br /&gt;
disyunción (es decir, en forma de proposición implicativa)&lt;br /&gt;
demostrada de forma muy automática y breve.&lt;br /&gt;
lemma version2: &amp;quot;(A ∨ B) ∨ C ⟶ A ∨ (B ∨ C)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
-- Otra versión. la sentencia &amp;quot;note&amp;quot; no es necesaria.&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ∨ B) ∨ C ⟶ A ∨ (B ∨ C)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1: &amp;quot;(A ∨ B) ∨ C&amp;quot;&lt;br /&gt;
   moreover&lt;br /&gt;
  { assume 4: &amp;quot;(A ∨ B)&amp;quot;&lt;br /&gt;
    moreover&lt;br /&gt;
    { assume 5: &amp;quot;A&amp;quot;&lt;br /&gt;
      from 5 have 6: &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI1)}&lt;br /&gt;
    moreover&lt;br /&gt;
    { assume 7: &amp;quot;B&amp;quot;&lt;br /&gt;
      from 7 have 8: &amp;quot;(B ∨ C)&amp;quot; by (rule disjI1)&lt;br /&gt;
      from 8 have 9: &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI2)}&lt;br /&gt;
    ultimately have &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjE)}&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume 2: &amp;quot;C&amp;quot;&lt;br /&gt;
    from 2 have 3: &amp;quot;(B ∨ C)&amp;quot; by (rule disjI2)&lt;br /&gt;
    from 3 have &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI2)}&lt;br /&gt;
  ultimately show &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma Aux:&lt;br /&gt;
  assumes &amp;quot;A&amp;quot;&lt;br /&gt;
  shows &amp;quot;B ⟶ A&amp;quot;&lt;br /&gt;
using assms by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma K: &amp;quot;A ⟶ (B ⟶ A)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1: &amp;quot;A&amp;quot;&lt;br /&gt;
  from 1 show &amp;quot;B ⟶ A&amp;quot; by (rule Aux)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Éste también se puede&lt;br /&gt;
obtener de forma totalmente&lt;br /&gt;
automática&amp;quot;&lt;br /&gt;
lemma K: &amp;quot;A ⟶ (B ⟶ A)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ⟶ (B ⟶C)) ⟶ ((A ⟶ B) ⟶ (A ⟶ C))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1:&amp;quot;A ⟶ (B ⟶ C)&amp;quot;&lt;br /&gt;
  show &amp;quot;(A ⟶ B) ⟶ (A ⟶C)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume 2:&amp;quot;(A ⟶ B)&amp;quot;&lt;br /&gt;
      show &amp;quot;A ⟶C&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume 3:&amp;quot;A&amp;quot;&lt;br /&gt;
        from 2 3 have 4:&amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
        from 1 3 have 5:&amp;quot;B ⟶ C&amp;quot; by (rule mp)&lt;br /&gt;
        from 5 4 show &amp;quot;C&amp;quot; by (rule mp)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Por simplificación es inmediata&lt;br /&gt;
su justificación&amp;quot;&lt;br /&gt;
lemma &amp;quot;(A ⟶ (B ⟶C)) ⟶ ((A ⟶ B) ⟶ (A ⟶ C))&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ⟶ B) ⟶ ((B ⟶ C) ⟶ (A ⟶ C))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1:&amp;quot;(A ⟶ B)&amp;quot;&lt;br /&gt;
  show &amp;quot;((B ⟶ C) ⟶ (A ⟶ C))&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    assume 2:&amp;quot;(B ⟶ C)&amp;quot;&lt;br /&gt;
    show &amp;quot;(A ⟶ C)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume 3:&amp;quot;A&amp;quot;&lt;br /&gt;
      from 1 3 have 4:&amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
      from 2 4 show &amp;quot;C&amp;quot; by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;También se puede obtener directamente&lt;br /&gt;
por simplificación&amp;quot;&lt;br /&gt;
lemma &amp;quot;(A ⟶ B) ⟶ ((B ⟶ C) ⟶ (A ⟶ C))&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬¬A ⟶ A&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1:&amp;quot;¬¬A&amp;quot;&lt;br /&gt;
  from 1 show &amp;quot;A&amp;quot; by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Está claro que éste sale&lt;br /&gt;
por auto y por simp&amp;quot;&lt;br /&gt;
lemma &amp;quot;¬¬A ⟶ A&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ⟶ ¬¬A&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1:&amp;quot;A&amp;quot;&lt;br /&gt;
  from 1 show &amp;quot;¬¬A&amp;quot; by (rule contrapos_pn)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma MT:&lt;br /&gt;
  assumes 1:&amp;quot;F ⟶ G&amp;quot; and 2:&amp;quot;¬G&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬F&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 3:&amp;quot;F&amp;quot;&lt;br /&gt;
  from 1 and 3 have 4:&amp;quot;G&amp;quot; by (rule mp)&lt;br /&gt;
  from 2 and 4 show False by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬A ⟶ B) ⟶ (¬B ⟶ A)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1:&amp;quot;(¬A ⟶ B)&amp;quot;&lt;br /&gt;
  show &amp;quot;(¬B ⟶ A)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume 2:&amp;quot;¬B&amp;quot;&lt;br /&gt;
    from 1 2 have 3:&amp;quot;¬¬A&amp;quot; by (rule MT)&lt;br /&gt;
    from 3 show &amp;quot;A&amp;quot; by (rule notnotD)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((A ⟶ B) ⟶ A) ⟶ A&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1: &amp;quot;(A ⟶ B) ⟶ A&amp;quot;&lt;br /&gt;
  have 8: &amp;quot;¬¬A&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
      assume 2: &amp;quot;¬A&amp;quot;&lt;br /&gt;
      have 3: &amp;quot;A ⟶ B&amp;quot;&lt;br /&gt;
      proof (rule impI)&lt;br /&gt;
        assume 4: &amp;quot;A&amp;quot;&lt;br /&gt;
        from 2 and 4 show &amp;quot;B&amp;quot; by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
      from 1 and 3 have 5: &amp;quot;A&amp;quot; by (rule mp)&lt;br /&gt;
      from 2 and 5 show False by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  from 8 show &amp;quot;A&amp;quot; by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Éste sale por auto pero no&lt;br /&gt;
por el método simp&amp;quot;&lt;br /&gt;
lemma &amp;quot;((A ⟶ B) ⟶ A) ⟶ A&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ∨ ¬A&amp;quot;&lt;br /&gt;
proof cases&lt;br /&gt;
  assume &amp;quot;A&amp;quot; thus ?thesis ..&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬A&amp;quot; thus ?thesis ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Demostración aún más corta&lt;br /&gt;
y automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;A ∨ ¬A&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬(A ∧ B)) = (¬A ∨ ¬B)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  {&lt;br /&gt;
  assume 1: &amp;quot;¬(A ∧ B)&amp;quot;&lt;br /&gt;
  have 2: &amp;quot;¬A ∨ A&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬A ∨ ¬B&amp;quot;&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      { assume 3: &amp;quot;¬A&amp;quot;&lt;br /&gt;
        thus  &amp;quot;¬A ∨ ¬B&amp;quot; by (rule disjI1) }&lt;br /&gt;
    next&lt;br /&gt;
      { assume 4: &amp;quot;A&amp;quot;&lt;br /&gt;
        have 5: &amp;quot;¬B ∨ B&amp;quot; by (rule excluded_middle)&lt;br /&gt;
        thus &amp;quot;¬A ∨ ¬B&amp;quot;&lt;br /&gt;
        proof (rule disjE)&lt;br /&gt;
          {assume 6: &amp;quot;¬B&amp;quot;&lt;br /&gt;
            thus &amp;quot;¬A ∨ ¬B&amp;quot; by (rule disjI2) }&lt;br /&gt;
          next&lt;br /&gt;
          {assume 7: &amp;quot;B&amp;quot;&lt;br /&gt;
             from 4 and 7 have 8: &amp;quot;A ∧ B&amp;quot; by (rule conjI)&lt;br /&gt;
             from 1 and 8 show &amp;quot;¬A ∨ ¬B&amp;quot; by (rule notE) }&lt;br /&gt;
        qed&lt;br /&gt;
      }      &lt;br /&gt;
    qed&lt;br /&gt;
  }&lt;br /&gt;
next&lt;br /&gt;
  { assume 1: &amp;quot;¬A ∨ ¬B&amp;quot;&lt;br /&gt;
    show &amp;quot;¬(A ∧ B)&amp;quot;&lt;br /&gt;
    proof (rule notI)&lt;br /&gt;
      assume 2: &amp;quot;A ∧ B&amp;quot;&lt;br /&gt;
      from 1 have 3:&amp;quot;¬A ∨ ¬B&amp;quot; .&lt;br /&gt;
      moreover&lt;br /&gt;
      { assume 4: &amp;quot;¬A&amp;quot;&lt;br /&gt;
        from 2 have 5:&amp;quot;A&amp;quot; by (rule conjunct1)&lt;br /&gt;
        from 4 and 5 have False by (rule notE) }&lt;br /&gt;
      moreover&lt;br /&gt;
      { assume 6: &amp;quot;¬B&amp;quot;&lt;br /&gt;
        from 2 have 7: &amp;quot;B&amp;quot; by (rule conjunct2)&lt;br /&gt;
        from 6 and 7 have False by (rule notE) }&lt;br /&gt;
      ultimately show False by (rule disjE)        &lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Si no queremos entrar en detalles&lt;br /&gt;
lo podríamos mandar a la &amp;#039;maza&amp;#039;&amp;quot;&lt;br /&gt;
lemma &amp;quot;(¬(A ∧ B)) = (¬A ∨ ¬B)&amp;quot;&lt;br /&gt;
by metis&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=116</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=116"/>
		<updated>2011-02-13T21:05:04Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 1ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_1&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Demostrar los siguientes lemas usando sólo las reglas básicas de&lt;br /&gt;
  deducción natural de la lógica proposicional.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma I: &amp;quot;A ⟶ A&amp;quot;&lt;br /&gt;
by (rule imp_refl)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se puede hacer automáticamente&amp;quot;&lt;br /&gt;
lemma I_d2: &amp;quot;A ⟶  A&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Otra forma (más explicita)&amp;quot;&lt;br /&gt;
lemma I_d3: &amp;quot;A ⟶ A&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;A&amp;quot;&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1:&amp;quot;A ∧ B&amp;quot; &lt;br /&gt;
  shows  &amp;quot;B ∧ A&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  from 1 have 2:&amp;quot;A&amp;quot; by (rule conjunct1)&lt;br /&gt;
  from 1 have 3:&amp;quot;B&amp;quot; by (rule conjunct2)&lt;br /&gt;
  from 3 2 show &amp;quot;B ∧ A&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;El ejercicio anterior hecho de un modo&lt;br /&gt;
automático (dado que no es posible hacerlo&lt;br /&gt;
por auto, es un buen candidato a que lo&lt;br /&gt;
resuelvan otros demostradores automáticos&lt;br /&gt;
proposicionales)&amp;quot;&lt;br /&gt;
lemma&lt;br /&gt;
  assumes 1:&amp;quot;A ∧ B&amp;quot; &lt;br /&gt;
  shows  &amp;quot;B ∧ A&amp;quot; &lt;br /&gt;
by (metis 1) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ∧ B ⟶ A ∨ B&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;A ∧ B&amp;quot;&lt;br /&gt;
  hence &amp;quot;A&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;A ∨ B&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;El anterior lemma&lt;br /&gt;
demostrado de forma aún más breve&amp;quot;&lt;br /&gt;
lemma &amp;quot;A ∧ B ⟶ A ∨ B&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes 1:&amp;quot;(A ∨ B) ∨ C&amp;quot;&lt;br /&gt;
  shows &amp;quot;A ∨ ( B ∨ C)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
note 1&lt;br /&gt;
 moreover&lt;br /&gt;
 { assume 2: &amp;quot;C&amp;quot;&lt;br /&gt;
   from 2 have 3:&amp;quot;B ∨ C&amp;quot; by (rule disjI2) &lt;br /&gt;
   from 3 have &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI2)}&lt;br /&gt;
 moreover&lt;br /&gt;
 { assume 4: &amp;quot;A ∨ B&amp;quot;&lt;br /&gt;
   from 4 have &amp;quot;(A ∨ B) ∨ C&amp;quot; by (rule disjI1) }&lt;br /&gt;
ultimately show &amp;quot;A ∨ (B ∨ C) &amp;quot; by (simp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- Otra forma (más explícita)&lt;br /&gt;
lemma version2: &amp;quot;(A ∨ B) ∨ C ⟶ A ∨ (B ∨ C)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1: &amp;quot;(A ∨ B) ∨ C&amp;quot;&lt;br /&gt;
  show &amp;quot;A ∨ (B ∨ C)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    note 1&lt;br /&gt;
    moreover{&lt;br /&gt;
      assume 2: &amp;quot;A ∨ B&amp;quot;&lt;br /&gt;
      have &amp;quot;A ∨ (B ∨ C)&amp;quot;&lt;br /&gt;
        proof -&lt;br /&gt;
          note 2&lt;br /&gt;
          moreover{&lt;br /&gt;
            assume 3: &amp;quot;A&amp;quot;&lt;br /&gt;
            from 3 have 4:&amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI1)&lt;br /&gt;
          }&lt;br /&gt;
          moreover{&lt;br /&gt;
            assume 5:&amp;quot;B&amp;quot;&lt;br /&gt;
            from 5 have 6: &amp;quot;B ∨ C&amp;quot; by (rule disjI1)&lt;br /&gt;
            from 6 have 7: &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI2)&lt;br /&gt;
          }&lt;br /&gt;
          ultimately show &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjE)&lt;br /&gt;
        qed&lt;br /&gt;
      }&lt;br /&gt;
      moreover{&lt;br /&gt;
        assume 8: &amp;quot;C&amp;quot;&lt;br /&gt;
        from 8 have 9: &amp;quot;B ∨ C&amp;quot; by (rule disjI2)&lt;br /&gt;
        from 9 have &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI2)&lt;br /&gt;
      }&lt;br /&gt;
      ultimately show &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjE)&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- La versión anterior de la propiedad asociativa de la&lt;br /&gt;
disyunción (es decir, en forma de proposición implicativa)&lt;br /&gt;
demostrada de forma muy automática y breve.&lt;br /&gt;
lemma version2: &amp;quot;(A ∨ B) ∨ C ⟶ A ∨ (B ∨ C)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
-- Otra versión. la sentencia &amp;quot;note&amp;quot; no es necesaria.&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ∨ B) ∨ C ⟶ A ∨ (B ∨ C)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1: &amp;quot;(A ∨ B) ∨ C&amp;quot;&lt;br /&gt;
   moreover&lt;br /&gt;
  { assume 4: &amp;quot;(A ∨ B)&amp;quot;&lt;br /&gt;
    moreover&lt;br /&gt;
    { assume 5: &amp;quot;A&amp;quot;&lt;br /&gt;
      from 5 have 6: &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI1)}&lt;br /&gt;
    moreover&lt;br /&gt;
    { assume 7: &amp;quot;B&amp;quot;&lt;br /&gt;
      from 7 have 8: &amp;quot;(B ∨ C)&amp;quot; by (rule disjI1)&lt;br /&gt;
      from 8 have 9: &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI2)}&lt;br /&gt;
    ultimately have &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjE)}&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume 2: &amp;quot;C&amp;quot;&lt;br /&gt;
    from 2 have 3: &amp;quot;(B ∨ C)&amp;quot; by (rule disjI2)&lt;br /&gt;
    from 3 have &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjI2)}&lt;br /&gt;
  ultimately show &amp;quot;A ∨ (B ∨ C)&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma Aux:&lt;br /&gt;
  assumes &amp;quot;A&amp;quot;&lt;br /&gt;
  shows &amp;quot;B ⟶ A&amp;quot;&lt;br /&gt;
using assms by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma K: &amp;quot;A ⟶ (B ⟶ A)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1: &amp;quot;A&amp;quot;&lt;br /&gt;
  from 1 show &amp;quot;B ⟶ A&amp;quot; by (rule Aux)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Éste también se puede&lt;br /&gt;
obtener de forma totalmente&lt;br /&gt;
automática&amp;quot;&lt;br /&gt;
lemma K: &amp;quot;A ⟶ (B ⟶ A)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ⟶ (B ⟶C)) ⟶ ((A ⟶ B) ⟶ (A ⟶ C))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1:&amp;quot;A ⟶ (B ⟶ C)&amp;quot;&lt;br /&gt;
  show &amp;quot;(A ⟶ B) ⟶ (A ⟶C)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume 2:&amp;quot;(A ⟶ B)&amp;quot;&lt;br /&gt;
      show &amp;quot;A ⟶C&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume 3:&amp;quot;A&amp;quot;&lt;br /&gt;
        from 2 3 have 4:&amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
        from 1 3 have 5:&amp;quot;B ⟶ C&amp;quot; by (rule mp)&lt;br /&gt;
        from 5 4 show &amp;quot;C&amp;quot; by (rule mp)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Por simplificación es inmediata&lt;br /&gt;
su justificación&amp;quot;&lt;br /&gt;
lemma &amp;quot;(A ⟶ (B ⟶C)) ⟶ ((A ⟶ B) ⟶ (A ⟶ C))&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ⟶ B) ⟶ ((B ⟶ C) ⟶ (A ⟶ C))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1:&amp;quot;(A ⟶ B)&amp;quot;&lt;br /&gt;
  show &amp;quot;((B ⟶ C) ⟶ (A ⟶ C))&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    assume 2:&amp;quot;(B ⟶ C)&amp;quot;&lt;br /&gt;
    show &amp;quot;(A ⟶ C)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume 3:&amp;quot;A&amp;quot;&lt;br /&gt;
      from 1 3 have 4:&amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
      from 2 4 show &amp;quot;C&amp;quot; by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;También se puede obtener directamente&lt;br /&gt;
por simplificación&amp;quot;&lt;br /&gt;
lemma &amp;quot;(A ⟶ B) ⟶ ((B ⟶ C) ⟶ (A ⟶ C))&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬¬A ⟶ A&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1:&amp;quot;¬¬A&amp;quot;&lt;br /&gt;
  from 1 show &amp;quot;A&amp;quot; by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Está claro que éste sale&lt;br /&gt;
por auto y por simp&amp;quot;&lt;br /&gt;
lemma &amp;quot;¬¬A ⟶ A&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ⟶ ¬¬A&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1:&amp;quot;A&amp;quot;&lt;br /&gt;
  from 1 show &amp;quot;¬¬A&amp;quot; by (rule contrapos_pn)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma MT:&lt;br /&gt;
  assumes 1:&amp;quot;F ⟶ G&amp;quot; and 2:&amp;quot;¬G&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬F&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 3:&amp;quot;F&amp;quot;&lt;br /&gt;
  from 1 and 3 have 4:&amp;quot;G&amp;quot; by (rule mp)&lt;br /&gt;
  from 2 and 4 show False by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬A ⟶ B) ⟶ (¬B ⟶ A)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1:&amp;quot;(¬A ⟶ B)&amp;quot;&lt;br /&gt;
  show &amp;quot;(¬B ⟶ A)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume 2:&amp;quot;¬B&amp;quot;&lt;br /&gt;
    from 1 2 have 3:&amp;quot;¬¬A&amp;quot; by (rule MT)&lt;br /&gt;
    from 3 show &amp;quot;A&amp;quot; by (rule notnotD)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((A ⟶ B) ⟶ A) ⟶ A&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1: &amp;quot;(A ⟶ B) ⟶ A&amp;quot;&lt;br /&gt;
  have 8: &amp;quot;¬¬A&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
      assume 2: &amp;quot;¬A&amp;quot;&lt;br /&gt;
      have 3: &amp;quot;A ⟶ B&amp;quot;&lt;br /&gt;
      proof (rule impI)&lt;br /&gt;
        assume 4: &amp;quot;A&amp;quot;&lt;br /&gt;
        from 2 and 4 show &amp;quot;B&amp;quot; by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
      from 1 and 3 have 5: &amp;quot;A&amp;quot; by (rule mp)&lt;br /&gt;
      from 2 and 5 show False by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  from 8 show &amp;quot;A&amp;quot; by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Éste sale por auto pero no&lt;br /&gt;
por el método simp&amp;quot;&lt;br /&gt;
lemma &amp;quot;((A ⟶ B) ⟶ A) ⟶ A&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ∨ ¬A&amp;quot;&lt;br /&gt;
proof cases&lt;br /&gt;
  assume &amp;quot;A&amp;quot; thus ?thesis ..&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬A&amp;quot; thus ?thesis ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Demostración aún más corta&lt;br /&gt;
y automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;A ∨ ¬A&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬(A ∧ B)) = (¬A ∨ ¬B)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  {&lt;br /&gt;
  assume 1: &amp;quot;¬(A ∧ B)&amp;quot;&lt;br /&gt;
  have 2: &amp;quot;¬A ∨ A&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬A ∨ ¬B&amp;quot;&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      { assume 3: &amp;quot;¬A&amp;quot;&lt;br /&gt;
        thus  &amp;quot;¬A ∨ ¬B&amp;quot; by (rule disjI1) }&lt;br /&gt;
    next&lt;br /&gt;
      { assume 4: &amp;quot;A&amp;quot;&lt;br /&gt;
        have 5: &amp;quot;¬B ∨ B&amp;quot; by (rule excluded_middle)&lt;br /&gt;
        thus &amp;quot;¬A ∨ ¬B&amp;quot;&lt;br /&gt;
        proof (rule disjE)&lt;br /&gt;
          {assume 6: &amp;quot;¬B&amp;quot;&lt;br /&gt;
            thus &amp;quot;¬A ∨ ¬B&amp;quot; by (rule disjI2) }&lt;br /&gt;
          next&lt;br /&gt;
          {assume 7: &amp;quot;B&amp;quot;&lt;br /&gt;
             from 4 and 7 have 8: &amp;quot;A ∧ B&amp;quot; by (rule conjI)&lt;br /&gt;
             from 1 and 8 show &amp;quot;¬A ∨ ¬B&amp;quot; by (rule notE) }&lt;br /&gt;
        qed&lt;br /&gt;
      }      &lt;br /&gt;
    qed&lt;br /&gt;
  }&lt;br /&gt;
next&lt;br /&gt;
  { assume 1: &amp;quot;¬A ∨ ¬B&amp;quot;&lt;br /&gt;
    show &amp;quot;¬(A ∧ B)&amp;quot;&lt;br /&gt;
    proof (rule notI)&lt;br /&gt;
      assume 2: &amp;quot;A ∧ B&amp;quot;&lt;br /&gt;
      from 1 have 3:&amp;quot;¬A ∨ ¬B&amp;quot; .&lt;br /&gt;
      moreover&lt;br /&gt;
      { assume 4: &amp;quot;¬A&amp;quot;&lt;br /&gt;
        from 2 have 5:&amp;quot;A&amp;quot; by (rule conjunct1)&lt;br /&gt;
        from 4 and 5 have False by (rule notE) }&lt;br /&gt;
      moreover&lt;br /&gt;
      { assume 6: &amp;quot;¬B&amp;quot;&lt;br /&gt;
        from 2 have 7: &amp;quot;B&amp;quot; by (rule conjunct2)&lt;br /&gt;
        from 6 and 7 have False by (rule notE) }&lt;br /&gt;
      ultimately show False by (rule disjE)        &lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Si no queremos entrar en detalles&lt;br /&gt;
lo podríamos mandar a la &amp;#039;maza&amp;#039;&amp;quot;&lt;br /&gt;
lemma &amp;quot;(¬(A ∧ B)) = (¬A ∨ ¬B)&amp;quot;&lt;br /&gt;
by metis&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jmuros</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_2&amp;diff=74</id>
		<title>Relación 2</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_2&amp;diff=74"/>
		<updated>2011-02-03T19:36:04Z</updated>

		<summary type="html">&lt;p&gt;Jmuros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 2ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_2&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional y de la lógica&lt;br /&gt;
  de predicados (allI, allE, exI y exE). &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(∃x. ∀y. P x y) ⟶ (∀y. ∃x. P x y)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 1: &amp;quot;∃x. ∀y. P x y&amp;quot;&lt;br /&gt;
    show &amp;quot;∀y. ∃x. P x y&amp;quot;&lt;br /&gt;
      proof (rule allI)&lt;br /&gt;
        from 1 obtain &amp;quot;x&amp;quot; where 2: &amp;quot;∀y. P x y&amp;quot; by (rule exE)&lt;br /&gt;
        fix y&lt;br /&gt;
        from 2 have 3: &amp;quot;P x y&amp;quot; by (rule allE)&lt;br /&gt;
        from 3 show 4: &amp;quot;∃x. P x y&amp;quot; by (rule exI)&lt;br /&gt;
     qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(∀x. P x ⟶ Q) = ((∃x. P x) ⟶ Q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((∀ x. P x) ∧ (∀ x. Q x)) = (∀ x. (P x ∧ Q x))&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((∀ x. P x) ∨ (∀ x. Q x)) = (∀ x. (P x ∨ Q x))&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((∃ x. P x) ∨ (∃ x. Q x)) = (∃ x. (P x ∨ Q x))&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬ (∀ x. P x)) = (∃ x. ¬ P x)&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>Jmuros</name></author>
		
	</entry>
</feed>