<?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=Palmagroblanco</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=Palmagroblanco"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php/Especial:Contribuciones/Palmagroblanco"/>
	<updated>2026-07-17T20:05:21Z</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_7&amp;diff=247</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_7&amp;diff=247"/>
		<updated>2011-03-04T17:32:49Z</updated>

		<summary type="html">&lt;p&gt;Palmagroblanco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 7ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_7_sol&lt;br /&gt;
imports Main Efficient_Nat&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Contador de occurrencias *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     veces :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ nat&amp;quot;&lt;br /&gt;
  tal que (veces x ys) es el número de occurrencias del elemento x en la&lt;br /&gt;
  lista ys. Por ejemplo, &lt;br /&gt;
    veces (2::nat) [2,1,2,5,2] = 3&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec veces :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;veces x [] = 0&amp;quot;&lt;br /&gt;
| &amp;quot;veces x (y#ys) = (if x = y then 1 + veces x ys else veces x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar:&lt;br /&gt;
     veces a (xs @ ys) = veces a xs + veces a ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;veces a (xs @ ys) = veces a xs + veces a ys&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar:&lt;br /&gt;
     veces a xs = veces a (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*} &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
    &amp;quot;veces a xs ≤ length xs&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;veces a xs ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Sabiendo que la función map aplica una función a todos los&lt;br /&gt;
  elementos de una lista: &lt;br /&gt;
     map f [x\&amp;lt;^isub&amp;gt;1,…,x\&amp;lt;^isub&amp;gt;n] = [f x\&amp;lt;^isub&amp;gt;1,…,f x\&amp;lt;^isub&amp;gt;n], &lt;br /&gt;
  demostrar o refutar&lt;br /&gt;
     veces a (map f xs) = veces (f a) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;veces a (map f xs) = veces (f a) xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text{*&lt;br /&gt;
El contraejemplo encontrado es el siguiente:&lt;br /&gt;
xs = [1]&lt;br /&gt;
f = (λx. 0)(1 := 0, 0 := 0)&lt;br /&gt;
a = 0&lt;br /&gt;
&lt;br /&gt;
Esto es: 0 = f(1) pero f(0) ≠ 1&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. La función &lt;br /&gt;
     filter :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; &lt;br /&gt;
  está definida por&lt;br /&gt;
     filter P []       = []&lt;br /&gt;
     filter P (x # xs) = (if P x then x # filter P xs else filter P xs)&lt;br /&gt;
  Encontrar una expresión e que no contenga filter tal que se verifique&lt;br /&gt;
  la siguiente propiedad: &lt;br /&gt;
     veces a (filter P xs) = e&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;veces a (filter P xs) = (if P a then veces a xs else 0)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Usando veces, definir la función &lt;br /&gt;
     borraDups :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot;&lt;br /&gt;
  tal que (borraDups xs) es la lista obtenida eliminando los elementos&lt;br /&gt;
  duplicados de la lista xs. Por ejemplo,  &lt;br /&gt;
     borraDups [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDups es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  El tipo correspondiente al conjunto imagen de la función definida&lt;br /&gt;
  no coincide con el indicado en la declaración de tipos del enunciado,&lt;br /&gt;
  dado que en él aparece erróneamente la salida de tipo bool, mientras&lt;br /&gt;
  que del resto del texto se deduce que la salida es una lista de&lt;br /&gt;
  elementos de tipo &amp;#039;a. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraDups :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDups [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDups (x#xs) = (if veces x xs &amp;gt; 0 then borraDups xs else (x#borraDups xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
Nota: para que no muestre error la función de evaluación&lt;br /&gt;
    hay que indicarle el tipo de los elementos de la lista.&lt;br /&gt;
    Por ejemplo:&lt;br /&gt;
          value &amp;quot;borraDups [1::nat,2,4,2,3]&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Encontrar una expresión e que no contenga la función&lt;br /&gt;
  borraDups tal que se verifique &lt;br /&gt;
     veces x (borraDups xs) = e&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;veces x (borraDups xs) = (if (veces x xs) &amp;gt;= 1 then 1 else 0)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Usando la función &amp;quot;veces&amp;quot;, definir la función &lt;br /&gt;
     distintos :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot;&lt;br /&gt;
  tal que (distintos xs) se verifica si cada elemento de xs aparece tan&lt;br /&gt;
  solo una vez. Por ejemplo, &lt;br /&gt;
     distintos [1,4,3]&lt;br /&gt;
     ¬ distintos [1,4,1]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función &amp;quot;distintos&amp;quot; es equivalente a la predefinida &amp;quot;distinct&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec distintos :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;distintos [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;distintos (x#xs) = (if veces x xs &amp;gt; 0 then False else distintos xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
Nota: para que no muestre error la función de evaluación&lt;br /&gt;
    hay que indicarle el tipo de los elementos de la lista.&lt;br /&gt;
    Por ejemplo:&lt;br /&gt;
           value &amp;quot;distintos [1::nat,4,1]&amp;quot;&lt;br /&gt;
*}&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 10. Demostrar que el valor de &amp;quot;borraDups&amp;quot; verifica &amp;quot;distintos&amp;quot;. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(distintos xs) ⟶ ((length xs) = (length (borraDups xs)))&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text{*&lt;br /&gt;
Si xs verifica el predicado distintos, entonces el tamaño de xs debe de ser el mismo&lt;br /&gt;
antes y despues de borrar los duplcados.&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Palmagroblanco</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_7&amp;diff=246</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_7&amp;diff=246"/>
		<updated>2011-03-03T17:40:25Z</updated>

		<summary type="html">&lt;p&gt;Palmagroblanco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* 7ª relación de ejercicios *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_7_sol&lt;br /&gt;
imports Main Efficient_Nat&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Contador de occurrencias *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función &lt;br /&gt;
     veces :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ nat&amp;quot;&lt;br /&gt;
  tal que (veces x ys) es el número de occurrencias del elemento x en la&lt;br /&gt;
  lista ys. Por ejemplo, &lt;br /&gt;
    veces (2::nat) [2,1,2,5,2] = 3&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec veces :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;veces x [] = 0&amp;quot;&lt;br /&gt;
| &amp;quot;veces x (y#ys) = (if x = y then 1 + veces x ys else veces x ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar o refutar:&lt;br /&gt;
     veces a (xs @ ys) = veces a xs + veces a ys&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;veces a (xs @ ys) = veces a xs + veces a ys&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar:&lt;br /&gt;
     veces a xs = veces a (rev xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*} &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar:&lt;br /&gt;
    &amp;quot;veces a xs ≤ length xs&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;veces a xs ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Sabiendo que la función map aplica una función a todos los&lt;br /&gt;
  elementos de una lista: &lt;br /&gt;
     map f [x\&amp;lt;^isub&amp;gt;1,…,x\&amp;lt;^isub&amp;gt;n] = [f x\&amp;lt;^isub&amp;gt;1,…,f x\&amp;lt;^isub&amp;gt;n], &lt;br /&gt;
  demostrar o refutar&lt;br /&gt;
     veces a (map f xs) = veces (f a) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;veces a (map f xs) = veces (f a) xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text{*&lt;br /&gt;
El contraejemplo encontrado es el siguiente:&lt;br /&gt;
xs = [1]&lt;br /&gt;
f = (λx. 0)(1 := 0, 0 := 0)&lt;br /&gt;
a = 0&lt;br /&gt;
&lt;br /&gt;
Esto es: 0 = f(1) pero f(0) ≠ 1&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. La función &lt;br /&gt;
     filter :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; &lt;br /&gt;
  está definida por&lt;br /&gt;
     filter P []       = []&lt;br /&gt;
     filter P (x # xs) = (if P x then x # filter P xs else filter P xs)&lt;br /&gt;
  Encontrar una expresión e que no contenga filter tal que se verifique&lt;br /&gt;
  la siguiente propiedad: &lt;br /&gt;
     veces a (filter P xs) = e&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;veces a (filter P xs) = (if P a then veces a xs else 0)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Usando veces, definir la función &lt;br /&gt;
     borraDups :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot;&lt;br /&gt;
  tal que (borraDups xs) es la lista obtenida eliminando los elementos&lt;br /&gt;
  duplicados de la lista xs. Por ejemplo,  &lt;br /&gt;
     borraDups [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDups es equivalente a la predefinida remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  El tipo correspondiente al conjunto imagen de la función definida&lt;br /&gt;
  no coincide con el indicado en la declaración de tipos del enunciado,&lt;br /&gt;
  dado que en él aparece erróneamente la salida de tipo bool, mientras&lt;br /&gt;
  que del resto del texto se deduce que la salida es una lista de&lt;br /&gt;
  elementos de tipo &amp;#039;a. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec borraDups :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;borraDups [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDups (x#xs) = (if veces x xs &amp;gt; 0 then borraDups xs else (x#borraDups xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
Nota: para que no muestre error la función de evaluación&lt;br /&gt;
    hay que indicarle el tipo de los elementos de la lista.&lt;br /&gt;
    Por ejemplo:&lt;br /&gt;
          value &amp;quot;borraDups [1::nat,2,4,2,3]&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Encontrar una expresión e que no contenga la función&lt;br /&gt;
  borraDups tal que se verifique &lt;br /&gt;
     veces x (borraDups xs) = e&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;veces x (borraDups xs) = (if (veces x xs) \&amp;lt;ge&amp;gt; 1 then 1 else 0)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Usando la función &amp;quot;veces&amp;quot;, definir la función &lt;br /&gt;
     distintos :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot;&lt;br /&gt;
  tal que (distintos xs) se verifica si cada elemento de xs aparece tan&lt;br /&gt;
  solo una vez. Por ejemplo, &lt;br /&gt;
     distintos [1,4,3]&lt;br /&gt;
     ¬ distintos [1,4,1]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función &amp;quot;distintos&amp;quot; es equivalente a la predefinida &amp;quot;distinct&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primrec distintos :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;distintos [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;distintos (x#xs) = (if veces x xs &amp;gt; 0 then False else distintos xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
Nota: para que no muestre error la función de evaluación&lt;br /&gt;
    hay que indicarle el tipo de los elementos de la lista.&lt;br /&gt;
    Por ejemplo:&lt;br /&gt;
           value &amp;quot;distintos [1::nat,4,1]&amp;quot;&lt;br /&gt;
*}&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 10. Demostrar que el valor de &amp;quot;borraDups&amp;quot; verifica &amp;quot;distintos&amp;quot;. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(distintos xs) ⟶ ((length xs) = (length (borraDups xs)))&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text{*&lt;br /&gt;
Si xs verifica el predicado distintos, entonces el tamaño de xs debe de ser el mismo&lt;br /&gt;
antes y despues de borrar los duplcados.&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Palmagroblanco</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_3&amp;diff=94</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=94"/>
		<updated>2011-02-07T10:56:21Z</updated>

		<summary type="html">&lt;p&gt;Palmagroblanco: &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;
oops&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;
oops&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;
oops&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;
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>Palmagroblanco</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=46</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=46"/>
		<updated>2011-02-01T16:38:35Z</updated>

		<summary type="html">&lt;p&gt;Palmagroblanco: &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;
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;
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) ⟶ (¬B ⟶ A)&amp;quot;&lt;br /&gt;
oops&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>Palmagroblanco</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=45</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=45"/>
		<updated>2011-02-01T16:37:13Z</updated>

		<summary type="html">&lt;p&gt;Palmagroblanco: &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;
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;
&lt;br /&gt;
lemma S: &amp;quot;(A ⟶ (B ⟶ C)) ⟶ ((A ⟶ B) ⟶ (A ⟶ C))&amp;quot;&lt;br /&gt;
oops&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;
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) ⟶ (¬B ⟶ A)&amp;quot;&lt;br /&gt;
oops&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>Palmagroblanco</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Relaci%C3%B3n_1&amp;diff=44</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=44"/>
		<updated>2011-02-01T16:36:10Z</updated>

		<summary type="html">&lt;p&gt;Palmagroblanco: &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;
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 &amp;quot;(A ∨ B) ∨ C ⟶ A ∨ (B ∨ C)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma K: &amp;quot;A ⟶ (B ⟶ A)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma S: &amp;quot;(A ⟶ (B ⟶ C)) ⟶ ((A ⟶ B) ⟶ (A ⟶ C))&amp;quot;&lt;br /&gt;
oops&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;
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) ⟶ (¬B ⟶ A)&amp;quot;&lt;br /&gt;
oops&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>Palmagroblanco</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Palmagroblanco&amp;diff=43</id>
		<title>Usuario:Palmagroblanco</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2010/index.php?title=Usuario:Palmagroblanco&amp;diff=43"/>
		<updated>2011-02-01T16:32:47Z</updated>

		<summary type="html">&lt;p&gt;Palmagroblanco: Página creada con &amp;#039;Pedro Almagro Blanco&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pedro Almagro Blanco&lt;/div&gt;</summary>
		<author><name>Palmagroblanco</name></author>
		
	</entry>
</feed>