Acciones

Relación 6

De Razonamiento automático (2010-11)

header {* 6ª relación de ejercicios *}

theory Relacion_6
imports Main 
begin

section {* Número de elementos válidos *}

text {* 
  --------------------------------------------------------------------- 
  Ejercicio 1. Definir la función 
     cuentaP :: "('a ⇒ bool) ⇒ 'a list ⇒ nat"
  tal que (cuentaP Q xs) es el número de elementos de la lista xs que
  satisfacen el predicado Q. Por ejemplo,   
     cuentaP (λx. 2<x) [1,3,4,0,5] = 3
  --------------------------------------------------------------------- 
*}



primrec cuentaP :: "('a ⇒ bool) ⇒ 'a list ⇒ nat" where
  "cuentaP Q [] = 0"
| "cuentaP Q (x#xs) = (if Q x then 1 + cuentaP Q xs else cuentaP Q xs)"




text {* 
  --------------------------------------------------------------------- 
  Ejercicio 2. Demostrar o refutar:
     cuentaP P (xs @ ys) = cuentaP P xs + cuentaP P ys*
  --------------------------------------------------------------------- 
*}


text {* 
Se puede demostrar tal como se indica a continuación
*}


lemma "cuentaP P (xs @ ys) = cuentaP P xs + cuentaP P ys"
by (induct xs arbitrary: ys) auto



text {* 
  --------------------------------------------------------------------- 
  Ejercicio 3. Demostrar que el número de elementos de una lista que
  cumplen una determinada propiedad es el mismo que el de esa lista
  invertida. 
  --------------------------------------------------------------------- 
*}


text {* 
Para demostrar el resultado propuesto en este ejercicio
he necesitado formular y demostrar un lema auxiliar.
*}

lemma cuentaP_almoh_snoc: "cuentaP Q (x#xs)= cuentaP Q (snoc xs x)"(is "?P xs")
proof (induct xs)
  show "?P []" by simp
  next
  fix x xs
  assume HI: "?P xs"
  thus "?P (x#xs)"
  proof (cases "Q x")
    case True thus "?thesis" using HI by auto
    next
    case False thus "?thesis" using HI by auto
  qed
qed


text {* 
En la demostración de este resultado, además del lema
auxiliar anterior, he debido introducir en las líneas
2 y 10 una proposición teoremática adicional sin la
cual el sistema no me aceptaba el razonamiento indicado.
*}

lemma "cuentaP Q xs = cuentaP Q (inversa xs)" (is "?P xs")
proof (induct xs)
  show "?P []" by simp
  next
  fix x xs
  assume 1: "?P xs"
  thus "?P (x#xs)"
  proof (cases "Q x")
    case True thus "?thesis"
    proof -
    have 2: "snoc (inversa xs) x = (inversa xs) @ [x]" by (rule snoc_append)
    from True have 3: "cuentaP Q (x#xs) = 1 + cuentaP Q xs" by auto
    also have 4: "... = 1 + cuentaP Q (inversa xs)" using 1 by auto
    also have 5: "... = cuentaP Q (x#(inversa xs))" using 1 and True by auto
    also have 6: "... = cuentaP Q (snoc (inversa xs) x)" by (rule cuentaP_almoh_snoc)
    also have 7: "... = cuentaP Q ((inversa xs) @ [x])" using 2 by auto
    also have 8: "... = cuentaP Q (inversa (x#xs))" by auto
    finally show 9: "cuentaP Q (x#xs) = cuentaP Q (inversa (x#xs))" by auto
    qed
    next
    case False thus "?thesis"
    proof -
    have 10: "snoc (inversa xs) x = (inversa xs) @ [x]" by (rule snoc_append)
    from False have 11: "cuentaP Q (x#xs) =cuentaP Q xs"  by auto
    also have 12: "... = cuentaP Q (inversa xs)" using 1 by auto
    also have 13: "... = cuentaP Q (x#(inversa xs))" using 1 and False by auto
    also have 14: "... = cuentaP Q (snoc (inversa xs) x)" by (rule cuentaP_almoh_snoc)
    also have 15: "... = cuentaP Q ((inversa xs) @ [x])" using 10 by auto
    also have 16: "... = cuentaP Q (inversa (x#xs))" by auto
    finally show 16: "cuentaP Q (x#xs) = cuentaP Q (inversa (x#xs))" by auto
    qed
  qed
qed



text {* 
  --------------------------------------------------------------------- 
  Ejercicio 4. Encontrar y demostrar una relación entre las funciones
  filter y  cuentaP. 
  --------------------------------------------------------------------- 
*}

text {*
Relación: El número de elementos de xs que cumplen la propiedad P será el número de elementos
que contendrá la lista resultante de aplicar el filtro P sobre xs.
*}

lemma "cuentaP P xs = length (filter P xs)"
by (induct xs) auto


end