<?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=Jgiraldez</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=Jgiraldez"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php/Especial:Contribuciones/Jgiraldez"/>
	<updated>2026-07-17T14:51:39Z</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_3&amp;diff=136</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=136"/>
		<updated>2011-02-14T16:25:39Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec algunos :: &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;algunos P [] = False&amp;quot;&lt;br /&gt;
  | &amp;quot;algunos P (x#xs) = (P x ∨ algunos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1:  &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have 2: &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = ((P a ∧ Q a) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
    also have 3: &amp;quot;... = ((P a ∧ Q a) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using 1 by simp&lt;br /&gt;
    also have 4: &amp;quot;... = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))&amp;quot; by blast&lt;br /&gt;
    also have 5: &amp;quot;... = ((todos P (a # xs) ∧ todos Q (a # xs)))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a x y&lt;br /&gt;
  assume 1: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(todos P ((a # x) @ y)) = (P a ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (a #x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&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;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P (rev (a # xs)) = todos P (a # xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;todos P (rev (a # xs)) = todos P (rev (xs) @ [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (rev (xs)) ∧ todos P [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P [a] ∧ todos P xs)&amp;quot; by blast&lt;br /&gt;
    also have &amp;quot;... = todos P ([a] @ xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = todos P (a # xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar:&lt;br /&gt;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P ([] @ ys) = (algunos P [] ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  thus &amp;quot;algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;algunos P ((a # xs) @ ys) = (P a ∨ algunos P (xs @ ys))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (P a ∨ (algunos P xs ∨ algunos P ys))&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = ((P a ∨ algunos P xs) ∨ algunos P ys)&amp;quot; by blast&lt;br /&gt;
    also have &amp;quot;... = (algunos P (a#xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot; algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;algunos P (rev (a # xs)) = algunos P (rev (xs) @ [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (algunos P (rev (xs)) ∨ algunos P ([a]))&amp;quot; by (simp add:algunos_append)&lt;br /&gt;
    also have &amp;quot;... = (algunos P xs ∨ algunos P [a])&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (algunos P [a] ∨ algunos P xs)&amp;quot; by blast&lt;br /&gt;
    also have &amp;quot;... = algunos P (a # xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []     = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (x=a ∨ estaEn x xs)&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (a#xs) = ((¬ (estaEn a xs)) ∧ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (a#xs) = &lt;br /&gt;
  (if estaEn a xs &lt;br /&gt;
   then borraDuplicados xs &lt;br /&gt;
   else (a#borraDuplicados xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=135</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=135"/>
		<updated>2011-02-14T16:13:09Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec algunos :: &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;algunos P [] = False&amp;quot;&lt;br /&gt;
  | &amp;quot;algunos P (x#xs) = (P x ∨ algunos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1:  &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have 2: &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = ((P a ∧ Q a) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
    also have 3: &amp;quot;... = ((P a ∧ Q a) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using 1 by simp&lt;br /&gt;
    also have 4: &amp;quot;... = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))&amp;quot; by blast&lt;br /&gt;
    also have 5: &amp;quot;... = ((todos P (a # xs) ∧ todos Q (a # xs)))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a x y&lt;br /&gt;
  assume 1: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(todos P ((a # x) @ y)) = (P a ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (a #x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&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;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P (rev (a # xs)) = todos P (a # xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;todos P (rev (a # xs)) = todos P (rev (xs) @ [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (rev (xs)) ∧ todos P [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P [a] ∧ todos P xs)&amp;quot; by blast&lt;br /&gt;
    also have &amp;quot;... = todos P ([a] @ xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = todos P (a # xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar:&lt;br /&gt;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P ([] @ ys) = (algunos P [] ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  thus &amp;quot;algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;algunos P ((a # xs) @ ys) = (P a ∨ algunos P (xs @ ys))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (P a ∨ (algunos P xs ∨ algunos P ys))&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = ((P a ∨ algunos P xs) ∨ algunos P ys)&amp;quot; by blast&lt;br /&gt;
    also have &amp;quot;... = (algunos P (a#xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []     = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (x=a ∨ estaEn x xs)&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (a#xs) = ((¬ (estaEn a xs)) ∧ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (a#xs) = &lt;br /&gt;
  (if estaEn a xs &lt;br /&gt;
   then borraDuplicados xs &lt;br /&gt;
   else (a#borraDuplicados xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=134</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=134"/>
		<updated>2011-02-14T16:07:13Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec algunos :: &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;algunos P [] = False&amp;quot;&lt;br /&gt;
  | &amp;quot;algunos P (x#xs) = (P x ∨ algunos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1:  &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have 2: &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = ((P a ∧ Q a) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
    also have 3: &amp;quot;... = ((P a ∧ Q a) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using 1 by simp&lt;br /&gt;
    also have 4: &amp;quot;... = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))&amp;quot; by blast&lt;br /&gt;
    also have 5: &amp;quot;... = ((todos P (a # xs) ∧ todos Q (a # xs)))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a x y&lt;br /&gt;
  assume 1: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(todos P ((a # x) @ y)) = (P a ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (a #x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&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;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P (rev (a # xs)) = todos P (a # xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;todos P (rev (a # xs)) = todos P (rev (xs) @ [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (rev (xs)) ∧ todos P [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P [a] ∧ todos P xs)&amp;quot; by blast&lt;br /&gt;
    also have &amp;quot;... = todos P ([a] @ xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = todos P (a # xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar:&lt;br /&gt;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []     = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (x=a ∨ estaEn x xs)&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (a#xs) = ((¬ (estaEn a xs)) ∧ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (a#xs) = &lt;br /&gt;
  (if estaEn a xs &lt;br /&gt;
   then borraDuplicados xs &lt;br /&gt;
   else (a#borraDuplicados xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=133</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=133"/>
		<updated>2011-02-14T15:55:51Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec algunos :: &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;algunos P [] = False&amp;quot;&lt;br /&gt;
  | &amp;quot;algunos P (x#xs) = (P x ∨ algunos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1:  &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have 2: &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = ((P a ∧ Q a) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
    also have 3: &amp;quot;... = ((P a ∧ Q a) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using 1 by simp&lt;br /&gt;
    also have 4: &amp;quot;... = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))&amp;quot; by blast&lt;br /&gt;
    also have 5: &amp;quot;... = ((todos P (a # xs) ∧ todos Q (a # xs)))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a x y&lt;br /&gt;
  assume 1: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(todos P ((a # x) @ y)) = (P a ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (a #x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&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;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P (rev (a # xs)) = todos P (a # xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;todos P (rev (a # xs)) = todos P (rev (xs) @ [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (rev (xs)) ∧ todos P [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P [a] ∧ todos P xs)&amp;quot; by blast&lt;br /&gt;
    also have &amp;quot;... = todos P ([a] @ xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = todos P (a # xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar:&lt;br /&gt;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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 algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []     = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (x=a ∨ estaEn x xs)&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (a#xs) = ((¬ (estaEn a xs)) ∧ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (a#xs) = &lt;br /&gt;
  (if estaEn a xs &lt;br /&gt;
   then borraDuplicados xs &lt;br /&gt;
   else (a#borraDuplicados xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=132</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=132"/>
		<updated>2011-02-14T15:53:58Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec algunos :: &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;algunos P [] = False&amp;quot;&lt;br /&gt;
  | &amp;quot;algunos P (x#xs) = (P x ∨ algunos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1:  &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have 2: &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = ((P a ∧ Q a) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
    also have 3: &amp;quot;... = ((P a ∧ Q a) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using 1 by simp&lt;br /&gt;
    also have 4: &amp;quot;... = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))&amp;quot; by blast&lt;br /&gt;
    also have 5: &amp;quot;... = ((todos P (a # xs) ∧ todos Q (a # xs)))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a x y&lt;br /&gt;
  assume 1: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(todos P ((a # x) @ y)) = (P a ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (a #x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&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;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P (rev (a # xs)) = todos P (a # xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;todos P (rev (a # xs)) = todos P (rev (xs) @ [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (rev (xs)) ∧ todos P [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P [a] ∧ todos P xs)&amp;quot; by blast&lt;br /&gt;
    also have &amp;quot;... = todos P ([a] @ xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = todos P (a # xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar o refutar:&lt;br /&gt;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) 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;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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 algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []     = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (x=a ∨ estaEn x xs)&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (a#xs) = ((¬ (estaEn a xs)) ∧ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (a#xs) = &lt;br /&gt;
  (if estaEn a xs &lt;br /&gt;
   then borraDuplicados xs &lt;br /&gt;
   else (a#borraDuplicados xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=131</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=131"/>
		<updated>2011-02-14T15:52:47Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec algunos :: &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;algunos P [] = False&amp;quot;&lt;br /&gt;
  | &amp;quot;algunos P (x#xs) = (P x ∨ algunos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1:  &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have 2: &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = ((P a ∧ Q a) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
    also have 3: &amp;quot;... = ((P a ∧ Q a) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using 1 by simp&lt;br /&gt;
    also have 4: &amp;quot;... = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))&amp;quot; by blast&lt;br /&gt;
    also have 5: &amp;quot;... = ((todos P (a # xs) ∧ todos Q (a # xs)))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a x y&lt;br /&gt;
  assume 1: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(todos P ((a # x) @ y)) = (P a ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (a #x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&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;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P 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;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) 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;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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 algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []     = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (x=a ∨ estaEn x xs)&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (a#xs) = ((¬ (estaEn a xs)) ∧ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (a#xs) = &lt;br /&gt;
  (if estaEn a xs &lt;br /&gt;
   then borraDuplicados xs &lt;br /&gt;
   else (a#borraDuplicados xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=130</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=130"/>
		<updated>2011-02-14T15:51:41Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec algunos :: &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;algunos P [] = False&amp;quot;&lt;br /&gt;
  | &amp;quot;algunos P (x#xs) = (P x ∨ algunos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume 1:  &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have 2: &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = ((P a ∧ Q a) ∧ (todos (λx. P x ∧ Q x) xs))&amp;quot; by simp&lt;br /&gt;
    also have 3: &amp;quot;... = ((P a ∧ Q a) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using 1 by simp&lt;br /&gt;
    also have 4: &amp;quot;... = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))&amp;quot; by blast&lt;br /&gt;
    also have 5: &amp;quot;... = ((todos P (a # xs) ∧ todos Q (a # xs)))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
lemma todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a x y&lt;br /&gt;
  assume 1: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(todos P ((a # x) @ y)) = (P a ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (a #x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&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;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P 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;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) 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;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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 algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []     = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (x=a ∨ estaEn x xs)&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sinDuplicados [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (a#xs) = ((¬ (estaEn a xs)) ∧ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDuplicados []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (a#xs) = &lt;br /&gt;
  (if estaEn a xs &lt;br /&gt;
   then borraDuplicados xs &lt;br /&gt;
   else (a#borraDuplicados xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=126</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=126"/>
		<updated>2011-02-14T15:10:31Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec algunos :: &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;algunos P [] = False&amp;quot;&lt;br /&gt;
  | &amp;quot;algunos P (x#xs) = (P x ∨ algunos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
lemma todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a x y&lt;br /&gt;
  assume 1: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(todos P ((a # x) @ y)) = (P a ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (a #x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&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;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P 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;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) 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;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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 algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=125</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=125"/>
		<updated>2011-02-14T15:09:24Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec algunos :: &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;algunos P [] = False&amp;quot;&lt;br /&gt;
  | &amp;quot;algunos P (x#xs) = (P x ∨ algunos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
lemma todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a x y&lt;br /&gt;
  assume 1: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(todos P ((a # x) @ y)) = (P a ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; using 1 by simp&lt;br /&gt;
    also have &amp;quot;... = (todos P (a #x) ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&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;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P 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;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) 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;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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 algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=124</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=124"/>
		<updated>2011-02-14T15:02:27Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec algunos :: &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;algunos P [] = False&amp;quot;&lt;br /&gt;
  | &amp;quot;algunos P (x#xs) = (P x ∨ algunos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar: &lt;br /&gt;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P 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;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) 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;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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 algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=123</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=123"/>
		<updated>2011-02-14T13:59:57Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec algunos :: &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;algunos P [] = False&amp;quot;&lt;br /&gt;
  | &amp;quot;algunos P (x#xs) = (P x ∨ algunos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&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 todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar: &lt;br /&gt;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P 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;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) 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;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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 algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=122</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=122"/>
		<updated>2011-02-14T13:42:21Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec algunos :: &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;algunos P [] = False&amp;quot;&lt;br /&gt;
  | &amp;quot;algunos P (x#xs) = (P x ∨ algunos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&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 todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar: &lt;br /&gt;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P 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;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) 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;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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 algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=121</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=121"/>
		<updated>2011-02-14T13:40:57Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec algunos :: &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;algunos P [] = False&amp;quot;&lt;br /&gt;
  | &amp;quot;algunos P (x#xs) = (P x ∨ algunosx P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&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 todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar: &lt;br /&gt;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P 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;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) 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;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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 algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=120</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=120"/>
		<updated>2011-02-14T13:39:51Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 3ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Cons inverso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir recursivamente la función &lt;br /&gt;
     snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (snoc xs a) es la lista obtenida al añadir el elemento a al&lt;br /&gt;
  final de la lista xs. Por ejemplo, &lt;br /&gt;
     value &amp;quot;snoc [2,5] (3::int)&amp;quot; == [2,5,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar @.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec snoc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;snoc [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;snoc (x#xs) y = x#(snoc xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar el siguiente teorema &lt;br /&gt;
     snoc xs a = xs @ [a]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del lema es&amp;quot;&lt;br /&gt;
lemma &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del lema es&amp;quot;&lt;br /&gt;
lemma snoc_append: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;snoc [] a = [] @ [a]&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix b xs &lt;br /&gt;
  assume HI: &amp;quot;snoc xs a = xs @ [a]&amp;quot;&lt;br /&gt;
  thus &amp;quot;snoc (b # xs) a = (b # xs) @ [a]&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;snoc (b # xs) a = b#(snoc xs a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... =  b#(xs @ [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (b#xs) @ [a]&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar el siguiente teorema &lt;br /&gt;
     rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons_auto: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
by (simp add:snoc_append)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada del teorema es&amp;quot;&lt;br /&gt;
theorem rev_cons: &amp;quot;rev (x # xs) = snoc (rev xs) x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have &amp;quot;rev(x#xs)=(rev xs) @ [x]&amp;quot; by simp &lt;br /&gt;
 also have &amp;quot;... = snoc (rev xs) x&amp;quot; by (simp add:snoc_append)&lt;br /&gt;
 finally show ?thesis .  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬ todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ (&amp;#039;a list ⇒ bool)&amp;quot; where&lt;br /&gt;
   &amp;quot;todos P [] = True&amp;quot;&lt;br /&gt;
  |&amp;quot;todos P (x#xs) = (P x ∧ todos P xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬ algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar: &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar o refutar: &lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&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 todos_append [simp]: &lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar o refutar: &lt;br /&gt;
     todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P 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;
lemma &amp;quot;todos P (rev xs) = todos P 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;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;Se busca un contraejemplo con nitpick&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El contraejemplo encontrado es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar o refutar: &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) 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;
lemma &amp;quot;algunos P (map f xs) = algunos (P ∘ f) 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;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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;algunos P (xs @ ys) = (algunos P xs ∨ algunos P 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 algunos_append: &lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar: &lt;br /&gt;
     algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P 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;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La ecuación se verifica eligiendo como Z el término  &lt;br /&gt;
     algunos P xs ∨ algunos Q xs&lt;br /&gt;
  En efecto,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;De forma estructurada&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar:&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
     &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Solución: La relación es &lt;br /&gt;
&lt;br /&gt;
  En efecto,  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función primitiva recursiva &lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función primitiva recursiva &lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar o refutar:&lt;br /&gt;
     length (borraDuplicados xs) ≤ length 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;
lemma &amp;quot;length (borraDuplicados xs) ≤ length 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;
lemma length_borraDuplicados: &lt;br /&gt;
  &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar: &lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados_auto: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a 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;
lemma estaEn_borraDuplicados: &lt;br /&gt;
  &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar o refutar: &lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática&amp;quot;&lt;br /&gt;
lemma &amp;quot;sinDuplicados (borraDuplicados 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;
lemma sinDuplicados_borraDuplicados:&lt;br /&gt;
  &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_2&amp;diff=93</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=93"/>
		<updated>2011-02-07T00:26:13Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &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;
&lt;br /&gt;
&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;
&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 (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;
      &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;
&lt;br /&gt;
&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;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
&lt;br /&gt;
&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;
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>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_2&amp;diff=92</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=92"/>
		<updated>2011-02-06T23:22:38Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &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;
&lt;br /&gt;
&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;
&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 (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;
      &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;
&lt;br /&gt;
&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;
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>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_2&amp;diff=91</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=91"/>
		<updated>2011-02-06T23:21:12Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &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;
&lt;br /&gt;
&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;
&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;
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>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=90</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=90"/>
		<updated>2011-02-06T23:19:47Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &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 explicito)&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;
&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;
&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;
&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;
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;
&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;
&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;
&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;
&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;
&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;
&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;
&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;
&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;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=89</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=89"/>
		<updated>2011-02-06T23:19:05Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &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 explicito)&lt;br /&gt;
lemma I: &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;
&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;
&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 &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;
&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;
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;
&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;
&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;
&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;
&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;
&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;
&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;
&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;
&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;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=88</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=88"/>
		<updated>2011-02-06T23:18:30Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &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 explicito)&lt;br /&gt;
lemma I: &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;
&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;
&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 &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;
&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;
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;
&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;
&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;
&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;
&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;
&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;
&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;
&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬(A ∧ B)) = (¬A ∨ ¬B)&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>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=87</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=87"/>
		<updated>2011-02-06T23:18:01Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &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 explicito)&lt;br /&gt;
lemma I: &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;
&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;
&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 &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;
&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;
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;
&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;
&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;
&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;
&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;
&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;
&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ∨ ¬A&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬(A ∧ B)) = (¬A ∨ ¬B)&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>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=86</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=86"/>
		<updated>2011-02-06T23:16:50Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &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 explicito)&lt;br /&gt;
lemma I: &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;
&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;
&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 &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;
&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;
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;
&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;
&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;
&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;
&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;
&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((A ⟶ B) ⟶ A) ⟶ A&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ∨ ¬A&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬(A ∧ B)) = (¬A ∨ ¬B)&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>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=85</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=85"/>
		<updated>2011-02-06T23:14:44Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &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 explicito)&lt;br /&gt;
lemma I: &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;
&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;
&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 &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;
&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;
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;
&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;
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;
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;
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;
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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ∨ ¬A&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬(A ∧ B)) = (¬A ∨ ¬B)&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>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=84</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=84"/>
		<updated>2011-02-06T23:13:15Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &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 explicito)&lt;br /&gt;
lemma I: &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;
&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;
&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 &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;
&lt;br /&gt;
&lt;br /&gt;
lemma K: &amp;quot;A ⟶ (B ⟶ A)&amp;quot;&lt;br /&gt;
oops&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;
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;
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;
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;
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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ∨ ¬A&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬(A ∧ B)) = (¬A ∨ ¬B)&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>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=83</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=83"/>
		<updated>2011-02-06T23:09:19Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &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 explicito)&lt;br /&gt;
lemma I: &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;
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;
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;
&lt;br /&gt;
lemma K: &amp;quot;A ⟶ (B ⟶ A)&amp;quot;&lt;br /&gt;
oops&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;
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;
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;
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;
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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ∨ ¬A&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬(A ∧ B)) = (¬A ∨ ¬B)&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>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=82</id>
		<title>Usuario:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=82"/>
		<updated>2011-02-06T23:05:41Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: /* RAZONAMIENTO AUTOMÁTICO 2010/11 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==RAZONAMIENTO AUTOMÁTICO 2010/11==&lt;br /&gt;
Realizado por Jesús Giráldez Crú&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=81</id>
		<title>Usuario discusión:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=81"/>
		<updated>2011-02-06T23:05:21Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: Página blanqueada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=73</id>
		<title>Usuario discusión:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=73"/>
		<updated>2011-02-03T16:00:35Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: /* RA_Relacion_2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== RA: Relacion 1 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
theory Relacion_1&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostrar los siguientes lemas usando sólo las reglas básicas de deducción&lt;br /&gt;
   natural de la lógica proposicional. *)&lt;br /&gt;
&lt;br /&gt;
lemma I: &amp;quot;A ⟶ A&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume 1: &amp;quot;A&amp;quot;&lt;br /&gt;
qed&lt;br /&gt;
  &lt;br /&gt;
lemma 0: &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;
  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 and 2 show &amp;quot;B ∧ A&amp;quot; by (rule conjI)&lt;br /&gt;
qed&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 1 have 3: &amp;quot;B&amp;quot; by (rule conjunct2)&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 &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;
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;
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;
&lt;br /&gt;
lemma S: &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 and 3 have 4: &amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
      from 1 and 3 have 5: &amp;quot;B ⟶ C&amp;quot; by (rule mp)&lt;br /&gt;
      from 5 and 4 show 6: &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;
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 and 3 have 4: &amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
      from 2 and 4 show 5: &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;
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;
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;
lemma MT:&lt;br /&gt;
  assumes 1: &amp;quot;F ⟶ G&amp;quot; and&lt;br /&gt;
          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 and 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;
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;
&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;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RA: Relacion 2 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
theory Relacion_2&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostrar o refutar los siguientes lemas usando sólo las reglas básicas&lt;br /&gt;
   de deducción natural de la lógica proposicional y de la lógica de &lt;br /&gt;
   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 x 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;
{&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;
}&lt;br /&gt;
next&lt;br /&gt;
{&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;
      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 have 9: &amp;quot;P a&amp;quot; by (rule conjE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
      from 8 have 11: &amp;quot;Q a&amp;quot; by (rule allE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed      &lt;br /&gt;
      &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;
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 exI)&lt;br /&gt;
      show &amp;quot; ∀x. P x y&amp;quot;&lt;br /&gt;
        proof (rule allI)&lt;br /&gt;
          fix x&lt;br /&gt;
          from 1 have 2: &amp;quot;∃y. P x y&amp;quot; by (rule allE)&lt;br /&gt;
          from 2 obtain y where 3: &amp;quot;P x y&amp;quot; by (rule exE)&lt;br /&gt;
          thus ?thesis ..&lt;br /&gt;
        qed&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬ (∀ x. P x)) = (∃ x. ¬ P x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
{&lt;br /&gt;
  assume 1: &amp;quot;¬ (∀ x. P x)&amp;quot; &lt;br /&gt;
  show &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
next&lt;br /&gt;
{&lt;br /&gt;
  assume 2: &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
  show &amp;quot;¬ (∀ x. P x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=72</id>
		<title>Usuario discusión:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=72"/>
		<updated>2011-02-03T16:00:21Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: /* RA_Relacion_1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== RA: Relacion 1 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
theory Relacion_1&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostrar los siguientes lemas usando sólo las reglas básicas de deducción&lt;br /&gt;
   natural de la lógica proposicional. *)&lt;br /&gt;
&lt;br /&gt;
lemma I: &amp;quot;A ⟶ A&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume 1: &amp;quot;A&amp;quot;&lt;br /&gt;
qed&lt;br /&gt;
  &lt;br /&gt;
lemma 0: &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;
  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 and 2 show &amp;quot;B ∧ A&amp;quot; by (rule conjI)&lt;br /&gt;
qed&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 1 have 3: &amp;quot;B&amp;quot; by (rule conjunct2)&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 &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;
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;
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;
&lt;br /&gt;
lemma S: &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 and 3 have 4: &amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
      from 1 and 3 have 5: &amp;quot;B ⟶ C&amp;quot; by (rule mp)&lt;br /&gt;
      from 5 and 4 show 6: &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;
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 and 3 have 4: &amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
      from 2 and 4 show 5: &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;
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;
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;
lemma MT:&lt;br /&gt;
  assumes 1: &amp;quot;F ⟶ G&amp;quot; and&lt;br /&gt;
          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 and 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;
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;
&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;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RA_Relacion_2 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
theory Relacion_2&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostrar o refutar los siguientes lemas usando sólo las reglas básicas&lt;br /&gt;
   de deducción natural de la lógica proposicional y de la lógica de &lt;br /&gt;
   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 x 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;
{&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;
}&lt;br /&gt;
next&lt;br /&gt;
{&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;
      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 have 9: &amp;quot;P a&amp;quot; by (rule conjE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
      from 8 have 11: &amp;quot;Q a&amp;quot; by (rule allE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed      &lt;br /&gt;
      &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;
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 exI)&lt;br /&gt;
      show &amp;quot; ∀x. P x y&amp;quot;&lt;br /&gt;
        proof (rule allI)&lt;br /&gt;
          fix x&lt;br /&gt;
          from 1 have 2: &amp;quot;∃y. P x y&amp;quot; by (rule allE)&lt;br /&gt;
          from 2 obtain y where 3: &amp;quot;P x y&amp;quot; by (rule exE)&lt;br /&gt;
          thus ?thesis ..&lt;br /&gt;
        qed&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬ (∀ x. P x)) = (∃ x. ¬ P x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
{&lt;br /&gt;
  assume 1: &amp;quot;¬ (∀ x. P x)&amp;quot; &lt;br /&gt;
  show &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
next&lt;br /&gt;
{&lt;br /&gt;
  assume 2: &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
  show &amp;quot;¬ (∀ x. P x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=71</id>
		<title>Usuario:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=71"/>
		<updated>2011-02-03T15:55:49Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: /* Relaciones de Ejercicios resueltos: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==RAZONAMIENTO AUTOMÁTICO 2010/11==&lt;br /&gt;
Realizado por Jesús Giráldez Crú&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Relaciones de Ejercicios resueltos:===&lt;br /&gt;
*Relación 1: [http://www.glc.us.es/~jalonso/WikiRA2010/index.php5/Usuario_Discusi%C3%B3n:Jgiraldez#RA_Relacion_1 Relacion_1] COMPLETA (Actualizado 03/02/2011)&lt;br /&gt;
*Relación 2: [http://www.glc.us.es/~jalonso/WikiRA2010/index.php5/Usuario_Discusi%C3%B3n:Jgiraldez#RA_Relacion_2 Relacion_2] 2/7 ejercicios completados (Actualizado 03/02/2011)&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=70</id>
		<title>Usuario discusión:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=70"/>
		<updated>2011-02-03T15:53:26Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: /* RA_Relacion_2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== RA_Relacion_1 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
theory Relacion_1&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostrar los siguientes lemas usando sólo las reglas básicas de deducción&lt;br /&gt;
   natural de la lógica proposicional. *)&lt;br /&gt;
&lt;br /&gt;
lemma I: &amp;quot;A ⟶ A&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume 1: &amp;quot;A&amp;quot;&lt;br /&gt;
qed&lt;br /&gt;
  &lt;br /&gt;
lemma 0: &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;
  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 and 2 show &amp;quot;B ∧ A&amp;quot; by (rule conjI)&lt;br /&gt;
qed&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 1 have 3: &amp;quot;B&amp;quot; by (rule conjunct2)&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 &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;
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;
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;
&lt;br /&gt;
lemma S: &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 and 3 have 4: &amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
      from 1 and 3 have 5: &amp;quot;B ⟶ C&amp;quot; by (rule mp)&lt;br /&gt;
      from 5 and 4 show 6: &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;
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 and 3 have 4: &amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
      from 2 and 4 show 5: &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;
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;
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;
lemma MT:&lt;br /&gt;
  assumes 1: &amp;quot;F ⟶ G&amp;quot; and&lt;br /&gt;
          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 and 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;
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;
&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;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RA_Relacion_2 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
theory Relacion_2&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostrar o refutar los siguientes lemas usando sólo las reglas básicas&lt;br /&gt;
   de deducción natural de la lógica proposicional y de la lógica de &lt;br /&gt;
   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 x 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;
{&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;
}&lt;br /&gt;
next&lt;br /&gt;
{&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;
      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 have 9: &amp;quot;P a&amp;quot; by (rule conjE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
      from 8 have 11: &amp;quot;Q a&amp;quot; by (rule allE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed      &lt;br /&gt;
      &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;
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 exI)&lt;br /&gt;
      show &amp;quot; ∀x. P x y&amp;quot;&lt;br /&gt;
        proof (rule allI)&lt;br /&gt;
          fix x&lt;br /&gt;
          from 1 have 2: &amp;quot;∃y. P x y&amp;quot; by (rule allE)&lt;br /&gt;
          from 2 obtain y where 3: &amp;quot;P x y&amp;quot; by (rule exE)&lt;br /&gt;
          thus ?thesis ..&lt;br /&gt;
        qed&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬ (∀ x. P x)) = (∃ x. ¬ P x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
{&lt;br /&gt;
  assume 1: &amp;quot;¬ (∀ x. P x)&amp;quot; &lt;br /&gt;
  show &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
next&lt;br /&gt;
{&lt;br /&gt;
  assume 2: &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
  show &amp;quot;¬ (∀ x. P x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=69</id>
		<title>Usuario discusión:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=69"/>
		<updated>2011-02-03T15:53:00Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: /* RA_Relacion_1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== RA_Relacion_1 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
theory Relacion_1&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostrar los siguientes lemas usando sólo las reglas básicas de deducción&lt;br /&gt;
   natural de la lógica proposicional. *)&lt;br /&gt;
&lt;br /&gt;
lemma I: &amp;quot;A ⟶ A&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume 1: &amp;quot;A&amp;quot;&lt;br /&gt;
qed&lt;br /&gt;
  &lt;br /&gt;
lemma 0: &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;
  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 and 2 show &amp;quot;B ∧ A&amp;quot; by (rule conjI)&lt;br /&gt;
qed&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 1 have 3: &amp;quot;B&amp;quot; by (rule conjunct2)&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 &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;
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;
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;
&lt;br /&gt;
lemma S: &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 and 3 have 4: &amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
      from 1 and 3 have 5: &amp;quot;B ⟶ C&amp;quot; by (rule mp)&lt;br /&gt;
      from 5 and 4 show 6: &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;
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 and 3 have 4: &amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
      from 2 and 4 show 5: &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;
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;
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;
lemma MT:&lt;br /&gt;
  assumes 1: &amp;quot;F ⟶ G&amp;quot; and&lt;br /&gt;
          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 and 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;
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;
&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;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RA_Relacion_2 ==&lt;br /&gt;
&lt;br /&gt;
theory Relacion_2&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostrar o refutar los siguientes lemas usando sólo las reglas básicas&lt;br /&gt;
   de deducción natural de la lógica proposicional y de la lógica de &lt;br /&gt;
   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 x 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;
{&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;
}&lt;br /&gt;
next&lt;br /&gt;
{&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;
      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 have 9: &amp;quot;P a&amp;quot; by (rule conjE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
      from 8 have 11: &amp;quot;Q a&amp;quot; by (rule allE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed      &lt;br /&gt;
      &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;
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 exI)&lt;br /&gt;
      show &amp;quot; ∀x. P x y&amp;quot;&lt;br /&gt;
        proof (rule allI)&lt;br /&gt;
          fix x&lt;br /&gt;
          from 1 have 2: &amp;quot;∃y. P x y&amp;quot; by (rule allE)&lt;br /&gt;
          from 2 obtain y where 3: &amp;quot;P x y&amp;quot; by (rule exE)&lt;br /&gt;
          thus ?thesis ..&lt;br /&gt;
        qed&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬ (∀ x. P x)) = (∃ x. ¬ P x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
{&lt;br /&gt;
  assume 1: &amp;quot;¬ (∀ x. P x)&amp;quot; &lt;br /&gt;
  show &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
next&lt;br /&gt;
{&lt;br /&gt;
  assume 2: &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
  show &amp;quot;¬ (∀ x. P x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=68</id>
		<title>Usuario:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=68"/>
		<updated>2011-02-03T15:48:30Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: /* Relaciones de Ejercicios resueltos: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==RAZONAMIENTO AUTOMÁTICO 2010/11==&lt;br /&gt;
Realizado por Jesús Giráldez Crú&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Relaciones de Ejercicios resueltos:===&lt;br /&gt;
*Relación 1: COMPLETA! (Actualizado 03/02/2011)&lt;br /&gt;
*Relación 2:&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=67</id>
		<title>Usuario:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=67"/>
		<updated>2011-02-03T15:41:18Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==RAZONAMIENTO AUTOMÁTICO 2010/11==&lt;br /&gt;
Realizado por Jesús Giráldez Crú&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Relaciones de Ejercicios resueltos:===&lt;br /&gt;
Relación 1: COMPLETA! (Actualizado 03/02/2011)&lt;br /&gt;
&lt;br /&gt;
Relación 2:&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=66</id>
		<title>Usuario:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=66"/>
		<updated>2011-02-03T15:41:07Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==RAZONAMIENTO AUTOMÁTICO 2010/11==&lt;br /&gt;
Realizado por Jesús Giráldez Crú&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Relaciones de Ejercicios resueltos:===&lt;br /&gt;
Relación 1: COMPLETA! (Actualizado 03/02/2011)&lt;br /&gt;
Relación 2:&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=65</id>
		<title>Usuario:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=65"/>
		<updated>2011-02-03T15:40:41Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==RAZONAMIENTO AUTOMÁTICO 2010/11==&lt;br /&gt;
Realizado por Jesús Giráldez Crú&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Relaciones de Ejercicios resueltos:===&lt;br /&gt;
&lt;br /&gt;
Relación 1: COMPLETA! (Actualizado 03/02/2011)&lt;br /&gt;
&lt;br /&gt;
Relación 2:&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=64</id>
		<title>Usuario:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=64"/>
		<updated>2011-02-03T15:40:27Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==RAZONAMIENTO AUTOMÁTICO 2010/11==&lt;br /&gt;
Realizado por Jesús Giráldez Crú&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Relaciones de Ejercicios resueltos:=&lt;br /&gt;
&lt;br /&gt;
Relación 1: COMPLETA! (Actualizado 03/02/2011)&lt;br /&gt;
&lt;br /&gt;
Relación 2:&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=63</id>
		<title>Usuario discusión:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=63"/>
		<updated>2011-02-03T15:37:27Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: /* RA_Relacion_1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== RA_Relacion_1 ==&lt;br /&gt;
&lt;br /&gt;
theory Relacion_1&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostrar los siguientes lemas usando sólo las reglas básicas de deducción&lt;br /&gt;
   natural de la lógica proposicional. *)&lt;br /&gt;
&lt;br /&gt;
lemma I: &amp;quot;A ⟶ A&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume 1: &amp;quot;A&amp;quot;&lt;br /&gt;
qed&lt;br /&gt;
  &lt;br /&gt;
lemma 0: &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;
  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 and 2 show &amp;quot;B ∧ A&amp;quot; by (rule conjI)&lt;br /&gt;
qed&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 1 have 3: &amp;quot;B&amp;quot; by (rule conjunct2)&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 &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;
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;
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;
&lt;br /&gt;
lemma S: &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 and 3 have 4: &amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
      from 1 and 3 have 5: &amp;quot;B ⟶ C&amp;quot; by (rule mp)&lt;br /&gt;
      from 5 and 4 show 6: &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;
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 and 3 have 4: &amp;quot;B&amp;quot; by (rule mp)&lt;br /&gt;
      from 2 and 4 show 5: &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;
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;
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;
lemma MT:&lt;br /&gt;
  assumes 1: &amp;quot;F ⟶ G&amp;quot; and&lt;br /&gt;
          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 and 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;
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;
&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;
end&lt;br /&gt;
&lt;br /&gt;
== RA_Relacion_2 ==&lt;br /&gt;
&lt;br /&gt;
theory Relacion_2&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostrar o refutar los siguientes lemas usando sólo las reglas básicas&lt;br /&gt;
   de deducción natural de la lógica proposicional y de la lógica de &lt;br /&gt;
   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 x 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;
{&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;
}&lt;br /&gt;
next&lt;br /&gt;
{&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;
      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 have 9: &amp;quot;P a&amp;quot; by (rule conjE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
      from 8 have 11: &amp;quot;Q a&amp;quot; by (rule allE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed      &lt;br /&gt;
      &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;
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 exI)&lt;br /&gt;
      show &amp;quot; ∀x. P x y&amp;quot;&lt;br /&gt;
        proof (rule allI)&lt;br /&gt;
          fix x&lt;br /&gt;
          from 1 have 2: &amp;quot;∃y. P x y&amp;quot; by (rule allE)&lt;br /&gt;
          from 2 obtain y where 3: &amp;quot;P x y&amp;quot; by (rule exE)&lt;br /&gt;
          thus ?thesis ..&lt;br /&gt;
        qed&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬ (∀ x. P x)) = (∃ x. ¬ P x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
{&lt;br /&gt;
  assume 1: &amp;quot;¬ (∀ x. P x)&amp;quot; &lt;br /&gt;
  show &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
next&lt;br /&gt;
{&lt;br /&gt;
  assume 2: &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
  show &amp;quot;¬ (∀ x. P x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=62</id>
		<title>Usuario discusión:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=62"/>
		<updated>2011-02-03T15:36:55Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: Nueva sección: /* RA_Relacion_2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== RA_Relacion_1 ==&lt;br /&gt;
&lt;br /&gt;
theory Relacion_2&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostrar o refutar los siguientes lemas usando sólo las reglas básicas&lt;br /&gt;
   de deducción natural de la lógica proposicional y de la lógica de &lt;br /&gt;
   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 x 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;
{&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;
}&lt;br /&gt;
next&lt;br /&gt;
{&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;
      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 have 9: &amp;quot;P a&amp;quot; by (rule conjE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
      from 8 have 11: &amp;quot;Q a&amp;quot; by (rule allE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed      &lt;br /&gt;
      &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;
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 exI)&lt;br /&gt;
      show &amp;quot; ∀x. P x y&amp;quot;&lt;br /&gt;
        proof (rule allI)&lt;br /&gt;
          fix x&lt;br /&gt;
          from 1 have 2: &amp;quot;∃y. P x y&amp;quot; by (rule allE)&lt;br /&gt;
          from 2 obtain y where 3: &amp;quot;P x y&amp;quot; by (rule exE)&lt;br /&gt;
          thus ?thesis ..&lt;br /&gt;
        qed&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬ (∀ x. P x)) = (∃ x. ¬ P x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
{&lt;br /&gt;
  assume 1: &amp;quot;¬ (∀ x. P x)&amp;quot; &lt;br /&gt;
  show &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
next&lt;br /&gt;
{&lt;br /&gt;
  assume 2: &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
  show &amp;quot;¬ (∀ x. P x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
== RA_Relacion_2 ==&lt;br /&gt;
&lt;br /&gt;
theory Relacion_2&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostrar o refutar los siguientes lemas usando sólo las reglas básicas&lt;br /&gt;
   de deducción natural de la lógica proposicional y de la lógica de &lt;br /&gt;
   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 x 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;
{&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;
}&lt;br /&gt;
next&lt;br /&gt;
{&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;
      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 have 9: &amp;quot;P a&amp;quot; by (rule conjE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
      from 8 have 11: &amp;quot;Q a&amp;quot; by (rule allE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed      &lt;br /&gt;
      &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;
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 exI)&lt;br /&gt;
      show &amp;quot; ∀x. P x y&amp;quot;&lt;br /&gt;
        proof (rule allI)&lt;br /&gt;
          fix x&lt;br /&gt;
          from 1 have 2: &amp;quot;∃y. P x y&amp;quot; by (rule allE)&lt;br /&gt;
          from 2 obtain y where 3: &amp;quot;P x y&amp;quot; by (rule exE)&lt;br /&gt;
          thus ?thesis ..&lt;br /&gt;
        qed&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬ (∀ x. P x)) = (∃ x. ¬ P x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
{&lt;br /&gt;
  assume 1: &amp;quot;¬ (∀ x. P x)&amp;quot; &lt;br /&gt;
  show &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
next&lt;br /&gt;
{&lt;br /&gt;
  assume 2: &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
  show &amp;quot;¬ (∀ x. P x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=61</id>
		<title>Usuario discusión:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario_discusi%C3%B3n:Jgiraldez&amp;diff=61"/>
		<updated>2011-02-03T15:35:55Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: RA_Relacion_1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== RA_Relacion_1 ==&lt;br /&gt;
&lt;br /&gt;
theory Relacion_2&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostrar o refutar los siguientes lemas usando sólo las reglas básicas&lt;br /&gt;
   de deducción natural de la lógica proposicional y de la lógica de &lt;br /&gt;
   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 x 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;
{&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;
}&lt;br /&gt;
next&lt;br /&gt;
{&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;
      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 have 9: &amp;quot;P a&amp;quot; by (rule conjE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
      from 8 have 11: &amp;quot;Q a&amp;quot; by (rule allE)&lt;br /&gt;
      (* seguir... *)&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed      &lt;br /&gt;
      &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;
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 exI)&lt;br /&gt;
      show &amp;quot; ∀x. P x y&amp;quot;&lt;br /&gt;
        proof (rule allI)&lt;br /&gt;
          fix x&lt;br /&gt;
          from 1 have 2: &amp;quot;∃y. P x y&amp;quot; by (rule allE)&lt;br /&gt;
          from 2 obtain y where 3: &amp;quot;P x y&amp;quot; by (rule exE)&lt;br /&gt;
          thus ?thesis ..&lt;br /&gt;
        qed&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(¬ (∀ x. P x)) = (∃ x. ¬ P x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
{&lt;br /&gt;
  assume 1: &amp;quot;¬ (∀ x. P x)&amp;quot; &lt;br /&gt;
  show &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
next&lt;br /&gt;
{&lt;br /&gt;
  assume 2: &amp;quot;∃ x. ¬ P x&amp;quot;&lt;br /&gt;
  show &amp;quot;¬ (∀ x. P x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      &lt;br /&gt;
    qed&lt;br /&gt;
}&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=60</id>
		<title>Usuario:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=60"/>
		<updated>2011-02-03T15:33:04Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RAZONAMIENTO AUTOMÁTICO 2010/11&lt;br /&gt;
&lt;br /&gt;
Realizado por Jesús Giráldez Crú&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Relaciones de Ejercicios resueltos:&lt;br /&gt;
&lt;br /&gt;
Relación 1: COMPLETA! (Actualizado 03/02/2011)&lt;br /&gt;
&lt;br /&gt;
Relación 2:&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=59</id>
		<title>Usuario:Jgiraldez</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Jgiraldez&amp;diff=59"/>
		<updated>2011-02-03T15:30:16Z</updated>

		<summary type="html">&lt;p&gt;Jgiraldez: Página creada con &amp;#039;RAZONAMIENTO AUTOMÁTICO 2010/11 Realizado por Jesús Giráldez Crú   Relaciones de Ejercicios resueltos: Relación 1: COMPLETA! (Actualizado 03/02/2011) Relación 2:&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RAZONAMIENTO AUTOMÁTICO 2010/11&lt;br /&gt;
Realizado por Jesús Giráldez Crú&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Relaciones de Ejercicios resueltos:&lt;br /&gt;
Relación 1: COMPLETA! (Actualizado 03/02/2011)&lt;br /&gt;
Relación 2:&lt;/div&gt;</summary>
		<author><name>Jgiraldez</name></author>
		
	</entry>
</feed>