Diferencia entre revisiones de «Relación 5»
De Razonamiento automático (2016-17)
(Página creada con '<source lang="isar"> chapter {* R5: Eliminación de duplicados *} theory R5_Eliminacion_de_duplicados imports Main begin text {* -----------------------------------...') |
|||
Línea 17: | Línea 17: | ||
*} | *} | ||
+ | (* crigomgom *) | ||
fun estaEn :: "'a ⇒ 'a list ⇒ bool" where | fun estaEn :: "'a ⇒ 'a list ⇒ bool" where | ||
− | "estaEn x xs = | + | "estaEn _ [] = False" |
+ | | "estaEn x (a#xs) = ((a = x) ∨ (estaEn x xs))" | ||
value "estaEn (2::nat) [3,2,4] = True" | value "estaEn (2::nat) [3,2,4] = True" | ||
Línea 34: | Línea 36: | ||
*} | *} | ||
+ | (* crigomgom *) | ||
fun sinDuplicados :: "'a list ⇒ bool" where | fun sinDuplicados :: "'a list ⇒ bool" where | ||
− | "sinDuplicados xs = | + | "sinDuplicados [] = True" |
+ | | "sinDuplicados (x#xs) = (¬ estaEn x xs ∧ sinDuplicados xs)" | ||
value "sinDuplicados [1::nat,4,2] = True" | value "sinDuplicados [1::nat,4,2] = True" | ||
Línea 53: | Línea 57: | ||
*} | *} | ||
+ | (* crigomgom *) | ||
fun borraDuplicados :: "'a list ⇒ 'a list" where | fun borraDuplicados :: "'a list ⇒ 'a list" where | ||
− | "borraDuplicados xs = | + | "borraDuplicados [] = []" |
+ | | "borraDuplicados (x#xs) =( if estaEn x xs then borraDuplicados xs else x#borraDuplicados xs)" | ||
value "borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]" | value "borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]" | ||
Línea 66: | Línea 72: | ||
-- "La demostración automática es" | -- "La demostración automática es" | ||
+ | (*crigomgom*) | ||
lemma length_borraDuplicados: | lemma length_borraDuplicados: | ||
"length (borraDuplicados xs) ≤ length xs" | "length (borraDuplicados xs) ≤ length xs" | ||
− | + | by (induct xs, simp_all) | |
text {* | text {* | ||
Línea 78: | Línea 85: | ||
-- "La demostración estructurada es" | -- "La demostración estructurada es" | ||
+ | (* crigomgom *) | ||
lemma length_borraDuplicados_2: | lemma length_borraDuplicados_2: | ||
"length (borraDuplicados xs) ≤ length xs" | "length (borraDuplicados xs) ≤ length xs" | ||
− | + | proof (induct xs) | |
+ | show "length (borraDuplicados []) ≤ length []" by simp | ||
+ | next | ||
+ | fix x xs | ||
+ | assume HI: "length (borraDuplicados xs) ≤ length xs" | ||
+ | show "length (borraDuplicados (x#xs)) ≤ length (x#xs)" | ||
+ | proof (cases) | ||
+ | assume "estaEn x xs" | ||
+ | then have "length (borraDuplicados (x#xs)) = length (borraDuplicados xs)" by simp | ||
+ | also have "... ≤ length xs" using HI by simp | ||
+ | also have "... ≤ length (x#xs)" by simp | ||
+ | finally show "length (borraDuplicados (x#xs)) ≤ length (x#xs)" by simp | ||
+ | next | ||
+ | assume "(¬ estaEn x xs)" | ||
+ | then have "length (borraDuplicados (x#xs)) = length (x#borraDuplicados xs)" by simp | ||
+ | also have "... = 1 + length (borraDuplicados xs)" by simp | ||
+ | also have "... ≤ 1 + length xs" using HI by simp | ||
+ | also have "... = length (x#xs)" by simp | ||
+ | finally show "length (borraDuplicados (x#xs)) ≤ length (x#xs)" by simp | ||
+ | qed | ||
+ | qed | ||
text {* | text {* | ||
Línea 90: | Línea 118: | ||
-- "La demostración automática es" | -- "La demostración automática es" | ||
+ | (* crigomgom *) | ||
lemma estaEn_borraDuplicados: | lemma estaEn_borraDuplicados: | ||
"estaEn a (borraDuplicados xs) = estaEn a xs" | "estaEn a (borraDuplicados xs) = estaEn a xs" | ||
− | + | by (induct xs) auto | |
text {* | text {* | ||
Línea 140: | Línea 169: | ||
--------------------------------------------------------------------- | --------------------------------------------------------------------- | ||
*} | *} | ||
+ | |||
+ | (*crigomgom*) | ||
+ | lemma "borraDuplicados (rev xs) = rev (borraDuplicados xs)" | ||
+ | quickcheck | ||
+ | oops | ||
end | end | ||
</source> | </source> |
Revisión del 12:45 25 nov 2016
chapter {* R5: Eliminación de duplicados *}
theory R5_Eliminacion_de_duplicados
imports Main
begin
text {*
---------------------------------------------------------------------
Ejercicio 1. Definir la funcion primitiva recursiva
estaEn :: 'a ⇒ 'a list ⇒ bool
tal que (estaEn x xs) se verifica si el elemento x está en la lista
xs. Por ejemplo,
estaEn (2::nat) [3,2,4] = True
estaEn (1::nat) [3,2,4] = False
---------------------------------------------------------------------
*}
(* crigomgom *)
fun estaEn :: "'a ⇒ 'a list ⇒ bool" where
"estaEn _ [] = False"
| "estaEn x (a#xs) = ((a = x) ∨ (estaEn x xs))"
value "estaEn (2::nat) [3,2,4] = True"
value "estaEn (1::nat) [3,2,4] = False"
text {*
---------------------------------------------------------------------
Ejercicio 2. Definir la función primitiva recursiva
sinDuplicados :: 'a list ⇒ bool
tal que (sinDuplicados xs) se verifica si la lista xs no contiene
duplicados. Por ejemplo,
sinDuplicados [1::nat,4,2] = True
sinDuplicados [1::nat,4,2,4] = False
---------------------------------------------------------------------
*}
(* crigomgom *)
fun sinDuplicados :: "'a list ⇒ bool" where
"sinDuplicados [] = True"
| "sinDuplicados (x#xs) = (¬ estaEn x xs ∧ sinDuplicados xs)"
value "sinDuplicados [1::nat,4,2] = True"
value "sinDuplicados [1::nat,4,2,4] = False"
text {*
---------------------------------------------------------------------
Ejercicio 3. Definir la función primitiva recursiva
borraDuplicados :: 'a list ⇒ bool
tal que (borraDuplicados xs) es la lista obtenida eliminando los
elementos duplicados de la lista xs. Por ejemplo,
borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]
Nota: La función borraDuplicados es equivalente a la predefinida
remdups.
---------------------------------------------------------------------
*}
(* crigomgom *)
fun borraDuplicados :: "'a list ⇒ 'a list" where
"borraDuplicados [] = []"
| "borraDuplicados (x#xs) =( if estaEn x xs then borraDuplicados xs else x#borraDuplicados xs)"
value "borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]"
text {*
---------------------------------------------------------------------
Ejercicio 4.1. Demostrar o refutar automáticamente
length (borraDuplicados xs) ≤ length xs
---------------------------------------------------------------------
*}
-- "La demostración automática es"
(*crigomgom*)
lemma length_borraDuplicados:
"length (borraDuplicados xs) ≤ length xs"
by (induct xs, simp_all)
text {*
---------------------------------------------------------------------
Ejercicio 4.2. Demostrar o refutar detalladamente
length (borraDuplicados xs) ≤ length xs
---------------------------------------------------------------------
*}
-- "La demostración estructurada es"
(* crigomgom *)
lemma length_borraDuplicados_2:
"length (borraDuplicados xs) ≤ length xs"
proof (induct xs)
show "length (borraDuplicados []) ≤ length []" by simp
next
fix x xs
assume HI: "length (borraDuplicados xs) ≤ length xs"
show "length (borraDuplicados (x#xs)) ≤ length (x#xs)"
proof (cases)
assume "estaEn x xs"
then have "length (borraDuplicados (x#xs)) = length (borraDuplicados xs)" by simp
also have "... ≤ length xs" using HI by simp
also have "... ≤ length (x#xs)" by simp
finally show "length (borraDuplicados (x#xs)) ≤ length (x#xs)" by simp
next
assume "(¬ estaEn x xs)"
then have "length (borraDuplicados (x#xs)) = length (x#borraDuplicados xs)" by simp
also have "... = 1 + length (borraDuplicados xs)" by simp
also have "... ≤ 1 + length xs" using HI by simp
also have "... = length (x#xs)" by simp
finally show "length (borraDuplicados (x#xs)) ≤ length (x#xs)" by simp
qed
qed
text {*
---------------------------------------------------------------------
Ejercicio 5.1. Demostrar o refutar automáticamente
estaEn a (borraDuplicados xs) = estaEn a xs
---------------------------------------------------------------------
*}
-- "La demostración automática es"
(* crigomgom *)
lemma estaEn_borraDuplicados:
"estaEn a (borraDuplicados xs) = estaEn a xs"
by (induct xs) auto
text {*
---------------------------------------------------------------------
Ejercicio 5.2. Demostrar o refutar detalladamente
estaEn a (borraDuplicados xs) = estaEn a xs
Nota: Para la demostración de la equivalencia se puede usar
proof (rule iffI)
La regla iffI es
⟦P ⟹ Q ; Q ⟹ P⟧ ⟹ P = Q
---------------------------------------------------------------------
*}
-- "La demostración estructurada es"
lemma estaEn_borraDuplicados_2:
"estaEn a (borraDuplicados xs) = estaEn a xs"
oops
text {*
---------------------------------------------------------------------
Ejercicio 6.1. Demostrar o refutar automáticamente
sinDuplicados (borraDuplicados xs)
---------------------------------------------------------------------
*}
-- "La demostración automática"
lemma sinDuplicados_borraDuplicados:
"sinDuplicados (borraDuplicados xs)"
oops
text {*
---------------------------------------------------------------------
Ejercicio 6.2. Demostrar o refutar detalladamente
sinDuplicados (borraDuplicados xs)
---------------------------------------------------------------------
*}
-- "La demostración estructurada es"
lemma sinDuplicados_borraDuplicados_2:
"sinDuplicados (borraDuplicados xs)"
oops
text {*
---------------------------------------------------------------------
Ejercicio 7. Demostrar o refutar:
borraDuplicados (rev xs) = rev (borraDuplicados xs)
---------------------------------------------------------------------
*}
(*crigomgom*)
lemma "borraDuplicados (rev xs) = rev (borraDuplicados xs)"
quickcheck
oops
end