Acciones

Diferencia entre revisiones de «Relación 5»

De Razonamiento automático (2013-14)

Línea 120: Línea 120:
 
   also have "...= (P a ∧ todos P x ∧ todos P y)" using HI by simp
 
   also have "...= (P a ∧ todos P x ∧ todos P y)" using HI by simp
 
   finally show "todos P ((a # x) @ y) =  (todos P (a # x) ∧ todos P y)" by simp
 
   finally show "todos P ((a # x) @ y) =  (todos P (a # x) ∧ todos P y)" by simp
 +
qed
 +
 +
-- "diecabmen1"
 +
lemma todos_append: "todos P (x @ y) = (todos P x ∧ todos P y)" (is "?P x y")
 +
proof (induct x)
 +
  show "?P [] y" by simp
 +
next
 +
  fix a x
 +
  assume HI: "?P x y"
 +
  have "todos P (a#x @ y) = (P a ∧ todos P (x@y))" by simp
 +
  also have "… = (P a ∧ todos P x ∧ todos P y)" using HI by simp
 +
  finally show "?P (a#x) y" by auto
 
qed
 
qed
  

Revisión del 18:15 7 dic 2013

header {* R5: Cuantificadores sobre listas *}

theory R5
imports Main 
begin

text {* 
  --------------------------------------------------------------------- 
  Ejercicio 1. Definir la función 
     todos :: ('a ⇒ bool) ⇒ 'a list ⇒ bool
  tal que (todos p xs) se verifica si todos los elementos de la lista 
  xs cumplen la propiedad p. Por ejemplo, se verifica 
     todos (λx. 1<length x) [[2,1,4],[1,3]]
     ¬todos (λx. 1<length x) [[2,1,4],[3]]

  Nota: La función todos es equivalente a la predefinida list_all. 
  --------------------------------------------------------------------- 
*}
-- "irealetei diecabmen1"
fun todos :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
  "todos p [] = True"
 |"todos p (x#xs) =(p x ∧ todos p xs)"

value "todos (λx. x>(1::nat)) [2,6,4]" -- "= True"
value "todos (λx. x>(2::nat)) [2,6,4]" -- "= False"

-- "diecabmen1"
value "algunos (λx. 1<length x) [[2,1,4],[3]]"
value "algunos (λx. 1<length x) [[],[3]]"

text {* 
  --------------------------------------------------------------------- 
  Ejercicio 2. Definir la función 
     algunos :: ('a ⇒ bool) ⇒ 'a list ⇒ bool
  tal que (algunos p xs) se verifica si algunos elementos de la lista 
  xs cumplen la propiedad p. Por ejemplo, se verifica 
     algunos (λx. 1<length x) [[2,1,4],[3]]
     ¬algunos (λx. 1<length x) [[],[3]]"

  Nota: La función algunos es equivalente a la predefinida list_ex. 
  --------------------------------------------------------------------- 
*}

-- "irealetei diecabmen1"
fun algunos  :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
  "algunos p [] = False"
 | "algunos p (x#xs) = (p x ∨ algunos p  (xs))"
value "algunos (λx. 1<length x) [[2,1,4],[3]]" -- "TRUE"
value "algunos (λx. 1<length x) [[],[3]]" -- "FALSE"

text {*
  --------------------------------------------------------------------- 
  Ejercicio 3.1. Demostrar o refutar automáticamente 
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)
  --------------------------------------------------------------------- 
*}

-- "irealetei diecabmen1"
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
by (induct xs) auto

text {*
  --------------------------------------------------------------------- 
  Ejercicio 3.2. Demostrar o refutar detalladamente
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)
  --------------------------------------------------------------------- 
*}

-- "irealetei"
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
proof (induct xs)
  show "todos (λx. P x ∧ Q x)[] = (todos P [] ∧ todos Q [])" by simp
next
  fix  a xs
  assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
  have "todos (λx. P x ∧ Q x) (a#xs) = ((P a ∧ Q a) ∧ todos (λx. P x ∧ Q x) xs )" by simp
  also have "... = (P a ∧ Q a ∧ todos P xs ∧ todos Q xs)" using HI by simp
  finally show "todos (λx. P x ∧ Q x) (a#xs) =  (todos P (a # xs) ∧ todos Q (a # xs))" by auto
qed

-- "diecabmen1"
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)" (is "?P xs")
proof (induct xs)
  show "?P []" by simp
next
  fix a xs
  assume HI: "?P xs"
  have "todos (λx. P x ∧ Q x) (a # xs) =  (( P a ∧ Q a)  ∧ todos  (λx. P x ∧ Q x) xs)" by simp 
  also have "… = (( P a ∧ Q a)  ∧ todos P xs ∧ todos Q xs)" using HI by simp
  finally show "?P (a#xs)" by auto
qed

text {*
  --------------------------------------------------------------------- 
  Ejercicio 4.1. Demostrar o refutar automáticamente
     todos P (x @ y) = (todos P x ∧ todos P y)
  --------------------------------------------------------------------- 
*}

-- "irealetei diecabmen1"
lemma "todos P (x @ y) = (todos P x ∧ todos P y)"
by (induct x ) auto

text {*
  --------------------------------------------------------------------- 
  Ejercicio 4.2. Demostrar o refutar detalladamente
     todos P (x @ y) = (todos P x ∧ todos P y)
  --------------------------------------------------------------------- 
*}
-- "irealetei"
lemma todos_append:
  "todos P (x @ y) = (todos P x ∧ todos P y)"
proof (induct x)
  show "todos P ([] @ y) = (todos P [] ∧ todos P y)" by simp
next
  fix a x
  assume HI:"todos P (x @ y) = (todos P x ∧ todos P y)"
  have " todos P ((a # x) @ y) = (P a ∧ todos P (x @ y))" by simp
  also have "...= (P a ∧ todos P x ∧ todos P y)" using HI by simp
  finally show "todos P ((a # x) @ y) =  (todos P (a # x) ∧ todos P y)" by simp
qed

-- "diecabmen1"
lemma todos_append: "todos P (x @ y) = (todos P x ∧ todos P y)" (is "?P x y")
proof (induct x)
  show "?P [] y" by simp
next
  fix a x
  assume HI: "?P x y"
  have "todos P (a#x @ y) = (P a ∧ todos P (x@y))" by simp
  also have "… = (P a ∧ todos P x ∧ todos P y)" using HI by simp
  finally show "?P (a#x) y" by auto
qed

text {*
  --------------------------------------------------------------------- 
  Ejercicio 5.1. Demostrar o refutar automáticamente 
     todos P (rev xs) = todos P xs
  --------------------------------------------------------------------- 
*}

--"maresccas4"

lemma "todos P (rev xs) = todos P xs"
apply (induct xs)
apply (simp_all add:todos_append)
by auto

text {*
  --------------------------------------------------------------------- 
  Ejercicio 5.2. Demostrar o refutar detalladamente
     todos P (rev xs) = todos P xs
  --------------------------------------------------------------------- 
*}

--"irealetei"
lemma "todos P (rev xs) = todos P xs"
proof (induct xs)
 show "todos P (rev []) = todos P []" by simp
next
 fix xs a
 assume HI:"todos P (rev xs) = todos P xs"
 have "todos P (rev (a # xs)) = todos P (rev xs @ [a])" by simp
 also have "... = ( P a ∧ todos P (rev xs))" by (simp add:todos_append) auto
 also have "... = ( P a ∧ todos P xs)" using HI by simp
 finally show "todos P (rev (a # xs))= todos P (a#xs)" by simp
qed

text {*
  --------------------------------------------------------------------- 
  Ejercicio 6. Demostrar o refutar:
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)
  --------------------------------------------------------------------- 
*}

--"irealetei"
lemma "algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)"
proof (induct xs)
 show "algunos (λx. P x ∧ Q x) [] = (algunos P [] ∧ algunos Q [])" by simp
next
  fix a xs
  assume HI:"algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)"
  have " algunos (λx. P x ∧ Q x) (a # xs) =((P a ∧ Q a) ∨ algunos (λx. P x ∧ Q x) xs)" by simp
  also have "... = ((P a ∧ Q a) ∨ (algunos P xs ∧ algunos Q xs))" using HI by simp
--"Me da que esto es falso"
qed

-- "maresccas4"
lemma "algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)"
quickcheck
oops
(* Contraejemplo:
  P = {a⇣1}
  Q = {a⇣2}
  xs = {a⇣1, a⇣2
*)

text {*
  --------------------------------------------------------------------- 
  Ejercicio 7.1. Demostrar o refutar automáticamente 
     algunos P (map f xs) = algunos (P ∘ f) xs
  --------------------------------------------------------------------- 
*}

-- "irealetei"
lemma "algunos P (map f xs) = algunos (P o f) xs"
by (induct xs) auto

text {*
  --------------------------------------------------------------------- 
  Ejercicio 7.2. Demostrar o refutar datalladamente
     algunos P (map f xs) = algunos (P ∘ f) xs
  --------------------------------------------------------------------- 
*}

-- "irealetei"
lemma "algunos P (map f xs) = algunos (P o f) xs"
proof (induct xs)
  show "algunos P (map f []) = algunos (P ∘ f) []" by simp
next
  fix a xs
  assume HI:"algunos P (map f xs) = algunos (P ∘ f) xs"
  have "algunos P (map f (a # xs)) =  algunos P (f a # (map f xs))" by simp
  also have "... = (P (f a) ∨ algunos P (map f xs))" by simp
  also have "... = (P (f a) ∨ algunos (P ∘ f) xs)" using HI by simp
  also have "... = ((P ∘ f) a ∨ algunos (P ∘ f) xs)" by simp
  finally show " algunos P (map f (a # xs)) = algunos (P ∘ f) (a # xs)" by simp
qed

text {*
  --------------------------------------------------------------------- 
  Ejercicio 8.1. Demostrar o refutar automáticamente 
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)
  --------------------------------------------------------------------- 
*}

-- "irealetei"
lemma "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
by (induct xs) auto

text {*
  --------------------------------------------------------------------- 
  Ejercicio 8.2. Demostrar o refutar detalladamente
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)
  --------------------------------------------------------------------- 
*}

-- "irealetei"
lemma algunos_append:
  "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
proof (induct xs)
  show "algunos P ([] @ ys) = (algunos P [] ∨ algunos P ys)" by simp
next
  fix a xs
  assume HI:"algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
  have " algunos P ((a # xs) @ ys) = (P a ∨ algunos P (xs @ys))" by simp
  also have "... = (P a ∨ algunos P xs ∨ algunos P ys)" using HI by simp
  finally show "algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)" by simp
qed

text {*
  --------------------------------------------------------------------- 
  Ejercicio 9.1. Demostrar o refutar automáticamente
     algunos P (rev xs) = algunos P xs
  --------------------------------------------------------------------- 
*}

-- "maresccas4"

lemma "algunos P (rev xs) = algunos P xs"
apply (induct xs)
apply (simp_all add:algunos_append)
by auto

text {*
  --------------------------------------------------------------------- 
  Ejercicio 9.2. Demostrar o refutar detalladamente
     algunos P (rev xs) = algunos P xs
  --------------------------------------------------------------------- 
*}

--"irealetei"
lemma "algunos P (rev xs) = algunos P xs"
proof (induct xs)
  show "algunos P (rev []) = algunos P []" by simp
next
  fix a xs
  assume HI:"algunos P (rev xs) = algunos P xs"
  have " algunos P (rev (a # xs))= algunos P (rev xs @ [a])" by simp
  also have "... = (P a ∨ algunos P (rev xs))" by (simp add:algunos_append) auto
  also have "... = (P a ∨ algunos P xs)" using HI by simp
  finally show "algunos P (rev (a # xs)) = algunos P (a # xs)" by simp
qed

text {*
  --------------------------------------------------------------------- 
  Ejercicio 10. Encontrar un término no trivial Z tal que sea cierta la 
  siguiente ecuación:
     algunos (λx. P x ∨ Q x) xs = Z
  y demostrar la equivalencia de forma automática y detallada.
  --------------------------------------------------------------------- 
*}

--"irealetei"
lemma "algunos (λx. P x ∨ Q x) xs =(algunos P xs ∨ algunos Q xs)"
by (induct xs) auto

lemma "algunos (λx. P x ∨ Q x) xs =(algunos P xs ∨ algunos Q xs)"
proof (induct xs)
  show " algunos (λx. P x ∨ Q x) [] = (algunos P [] ∨ algunos Q [])" by simp
next
  fix a xs
  assume HI:"algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)"
  have " algunos (λx. P x ∨ Q x) (a # xs) = ((P a ∨ Q a) ∨ algunos (λx. P x ∨ Q x) xs)" by simp
  also have "... = ((P a ∨ Q a) ∨ (algunos P xs ∨ algunos Q xs))" using HI by simp
  also have "... = (P a  ∨ algunos P xs ∨ Q a ∨ algunos Q xs)" by auto
  finally show " algunos (λx. P x ∨ Q x) (a # xs) = (algunos P (a # xs) ∨ algunos Q (a # xs))" by simp
qed


text {*
  --------------------------------------------------------------------- 
  Ejercicio 11.1. Demostrar o refutar automáticamente
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)
  --------------------------------------------------------------------- 
*}

-- "irealetei"
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
by (induct xs) auto

     
text {*
  --------------------------------------------------------------------- 
  Ejercicio 11.2. Demostrar o refutar datalladamente
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)
  --------------------------------------------------------------------- 
*}

--"irealetei"
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
proof (induct xs)
  show "algunos P [] = (¬ todos (λx. ¬ P x) [])" by simp
next
  fix a xs
  assume HI:"algunos P xs = (¬ todos (λx. ¬ P x) xs)"
  have "algunos P (a # xs) = (P a ∨ algunos P xs)" by simp
  also have "... = (P a ∨ (¬ todos (λx. ¬ P x) xs))" using HI by simp
  also have "... = (¬(¬P a ∧ ¬¬ todos (λx. ¬ P x) xs))" by simp
  also have "... = (¬(¬P a ∧ todos (λx. ¬ P x) xs))" by simp
  finally show "algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))" by simp
qed
     
text {*
  --------------------------------------------------------------------- 
  Ejercicio 12. 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
  --------------------------------------------------------------------- 
*}

--"irealetei"
fun estaEn :: "'a ⇒ 'a list ⇒ bool" where
  "estaEn x [] = 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 13. Expresar la relación existente entre estaEn y algunos. 
  Demostrar dicha relación de forma automática y detallada.
  --------------------------------------------------------------------- 
*}
-- "irealetei"

fun igual :: "'a ⇒ 'a ⇒ bool" where
"igual x y = (x=y)"


lemma "(algunos (igual x) xs) = (estaEn x xs)"
by (induct xs) auto

lemma "(algunos (igual x) xs) = (estaEn x xs)"
proof (induct xs)
  show " algunos (igual x) [] = estaEn x []" by simp
next
  fix a xs
  assume HI:"algunos (igual x) xs = estaEn x xs"
  have "algunos (igual x) (a # xs) = (igual x a ∨ algunos (igual x) xs)" by simp
  also have "... = (igual x a ∨ estaEn x xs)" using HI by simp
  finally show "algunos (igual x) (a # xs) = (estaEn x (a#xs))" by simp auto  
qed


text {* 
  --------------------------------------------------------------------- 
  Ejercicio 14. 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
  --------------------------------------------------------------------- 
*}

fun sinDuplicados :: "'a list ⇒ bool" where
  "sinDuplicados xs = undefined"

text {* 
  --------------------------------------------------------------------- 
  Ejercicio 15. 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. 
  --------------------------------------------------------------------- 
*}

fun borraDuplicados :: "'a list ⇒ 'a list" where
  "borraDuplicados xs = undefined"

text {*
  --------------------------------------------------------------------- 
  Ejercicio 16.1. Demostrar o refutar automáticamente
     length (borraDuplicados xs) ≤ length xs
  --------------------------------------------------------------------- 
*}

lemma length_borraDuplicados:
  "length (borraDuplicados xs) ≤ length xs"
oops

text {*
  --------------------------------------------------------------------- 
  Ejercicio 16.2. Demostrar o refutar detalladamente
     length (borraDuplicados xs) ≤ length xs
  --------------------------------------------------------------------- 
*}

lemma length_borraDuplicados:
  "length (borraDuplicados xs) ≤ length xs"
oops

text {*
  --------------------------------------------------------------------- 
  Ejercicio 17.1. Demostrar o refutar automáticamente 
     estaEn a (borraDuplicados xs) = estaEn a xs
  --------------------------------------------------------------------- 
*}

lemma "estaEn a (borraDuplicados xs) = estaEn a xs"
oops

text {*
  --------------------------------------------------------------------- 
  Ejercicio 17.2. Demostrar o refutar detalladamente
     estaEn a (borraDuplicados xs) = estaEn a xs
  --------------------------------------------------------------------- 
*}

lemma estaEn_borraDuplicados: 
  "estaEn a (borraDuplicados xs) = estaEn a xs"
oops

text {*
  --------------------------------------------------------------------- 
  Ejercicio 18.1. Demostrar o refutar automáticamente 
     sinDuplicados (borraDuplicados xs)
  --------------------------------------------------------------------- 
*}

lemma "sinDuplicados (borraDuplicados xs)"
oops

text {*
  --------------------------------------------------------------------- 
  Ejercicio 18.2. Demostrar o refutar detalladamente
     sinDuplicados (borraDuplicados xs)
  --------------------------------------------------------------------- 
*}

lemma sinDuplicados_borraDuplicados:
  "sinDuplicados (borraDuplicados xs)"
oops

text {*
  --------------------------------------------------------------------- 
  Ejercicio 19. Demostrar o refutar:
    borraDuplicados (rev xs) = rev (borraDuplicados xs)
  --------------------------------------------------------------------- 
*}

lemma "borraDuplicados (rev xs) = rev (borraDuplicados xs)"
oops

end