Acciones

RA12 Relación 18

De DAO (Demostración asistida por ordenador)

Revisión del 13:47 15 jul 2018 de Jalonso (discusión | contribuciones) (Texto reemplazado: «lang="isar"» por «lang="isabelle"»)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
header {* R18: Ordenación de listas por mezcla *}

theory R18
imports Main
begin

text {*
  En esta relación de ejercicios se define el algoritmo de ordenación de
  listas por mezcla y se demuestra que es correcto.
*}

section {* Ordenación de listas *}

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 1. Definir la función
     menor :: nat ⇒ nat list ⇒ bool
  tal que (menor a xs) se verifica si a es menor o igual que todos los
  elementos de xs.Por ejemplo,  
     menor 2 [3,2,5] = True
     menor 2 [3,0,5] = False
  ------------------------------------------------------------------ *}

fun menor :: "nat ⇒ nat list ⇒ bool" where
  "menor a xs = undefined"

value "menor 2 [3,2,5]" -- "= True"
value "menor 2 [3,0,5]" -- "= False"

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 2. Definir la función
     ordenada :: nat list ⇒ bool
  tal que (ordenada xs) se verifica si xs es una lista ordenada de
  manera creciente. Por ejemplo,  
     ordenada [2,3,3,5] = True 
     ordenada [2,4,3,5] = False 
  ------------------------------------------------------------------ *}

fun ordenada :: "nat list ⇒ bool" where
  "ordenada xs = undefined"

value "ordenada [2,3,3,5]" -- "= True" 
value "ordenada [2,4,3,5]" -- "= False" 

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 3. Definir la función
     cuenta :: nat list => nat => nat
  tal que (cuenta xs y) es el número de veces que aparece el elemento y
  en la lista xs. Por ejemplo, 
     cuenta [1,3,4,3,5] 3 = 2
  ------------------------------------------------------------------ *}

fun cuenta :: "nat list => nat => nat" where
  "cuenta xs y = undefined"

value "cuenta [1,3,4,3,5] 3" -- "= 2"

section {* Ordenación por mezcla *}

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 4. Definir la función
     mezcla :: nat list ⇒ nat list ⇒ nat list
  tal que (mezcla xs ys) es la lista obtenida mezclando las listas
  ordenadas xs e ys. Por ejemplo, 
     mezcla [1,2,5] [3,5,7] = [1,2,3,5,5,7]
  ------------------------------------------------------------------ *}

fun mezcla :: "nat list ⇒ nat list ⇒ nat list" where
  "mezcla xs ys = undefined"

value "mezcla [1,2,5] [3,5,7]" -- "= [1,2,3,5,5,7]"

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 5. Definir la función
     ordenaM :: nat list ⇒ nat list
  tal que (ordenaM xs) es la lista obtenida ordenando la lista xs
  mediante mezclas; es decir, la divide en dos mitades, las ordena y las
  mezcla. Por ejemplo, 
     
  ------------------------------------------------------------------ *}

fun ordenaM :: "nat list ⇒ nat list" where
  "ordenaM xs = undefined"

value "ordenaM [3,2,5,2]" -- "= [2,2,3,5]"

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 6. Sea x ≤ y. Si y es menor o igual que todos los elementos
  de xs, entonces x es menor o igual que todos los elementos de xs
  ------------------------------------------------------------------ *}

lemma menor_menor: 
  "x ≤ y ⟹ menor y xs ⟶ menor x xs"
oops

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 7. Demostrar que el número de veces que aparece n en la
  mezcla de dos listas es igual a la suma del número de apariciones en
  cada una de las listas
  ------------------------------------------------------------------ *}

lemma cuenta_mezcla: 
  "cuenta (mezcla xs ys) n = cuenta xs n + cuenta ys n"
oops

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 8. Demostrar que x es menor que todos los elementos de ys y
  de zs, entonces también lo es de su mezcla.
  ------------------------------------------------------------------ *}

lemma menor_mezcla:
  assumes "menor x ys" 
          "menor x zs" 
  shows   "menor x (mezcla ys zs)"
oops

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 9. Demostrar que la mezcla de dos listas ordenadas es una
  lista ordenada. 
  Indicación: Usar los siguientes lemas
  · linorder_not_le: (¬ x ≤ y) = (y < x)
  · order_less_le:   (x < y) = (x ≤ y ∧ x ≠ y)
  ------------------------------------------------------------------ *}

lemma ordenada_mezcla:
  assumes "ordenada xs" 
          "ordenada ys" 
  shows   "ordenada (mezcla xs ys)"
oops

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 10. Demostrar que si x es mayor que 1, entonces el mínimo de
  x y su mitad es menor que x.
  Indicación: Usar los siguientes lemas
  · min_def:         min a b = (if a ≤ b then a else b)
  · linorder_not_le: (¬ x ≤ y) = (y < x)
  ------------------------------------------------------------------ *}

lemma min_mitad: 
  "1 < x ⟹ min x (x div 2::nat) < x"
oops

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 11. Demostrar que si x es mayor que 1, entonces x menos su
  mitad es menor que x. 
  ------------------------------------------------------------------ *}

lemma menos_mitad: 
  "1 < x ⟹ x - x div (2::nat) < x"
oops

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 11. Demostrar que (ordenaM xs) está ordenada.
  ------------------------------------------------------------------ *}

theorem ordenada_ordenaM:
  "ordenada (ordenaM xs)"
oops

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 12. Demostrar que el número de apariciones de un elemento en
  la concatenación de dos listas es la suma del número de apariciones en
  cada una.
  ------------------------------------------------------------------ *}

lemma cuenta_conc: 
  "cuenta (xs @ ys) x = cuenta xs x + cuenta ys x"
oops

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 13. Demostrar que las listas xs y (ordenaM xs) tienen los
  mismos elementos.
  ------------------------------------------------------------------ *}

theorem cuenta_ordenaM: 
  "cuenta (ordenaM xs) x = cuenta xs x"
oops

end