Acciones

Diferencia entre revisiones de «Relación 4»

De Razonamiento automático (2016-17)

m (Texto reemplazado: «"isar"» por «"isabelle"»)
 
(No se muestran 78 ediciones intermedias de 19 usuarios)
Línea 1: Línea 1:
<source lang="isar">
+
<source lang="isabelle">
 
chapter {* R4: Cuantificadores sobre listas *}
 
chapter {* R4: Cuantificadores sobre listas *}
  
Línea 19: Línea 19:
 
*}
 
*}
  
{*danrodcha*}
+
(* danrodcha ivamenjim migtermor dancorgar wilmorort marpoldia1
fun todos :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
+
  ferrenseg paupeddeg pablucoto crigomgom anaprarod serrodcal juacabsou
  "todos p xs =  "todos p []    = True"
+
  rubgonmar josgarsan fraortmoy lucnovdos pabrodmac fracorjim1
| "todos p (x#xs) = (p x ∧ todos p xs)""
+
  marcarmor13 jeamacpov antsancab1 *)  
 
 
(* ivamenjim migtermor dancorgar wilmorort marpoldia1 ferrenseg paupeddeg pablucoto crigomgom anaprarod serrodcal juacabsou rubgonmar josgarsan fraortmoy lucnovdos*)
 
 
fun todos :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
 
fun todos :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
 
   "todos p []    = True"
 
   "todos p []    = True"
Línea 42: Línea 40:
 
*}
 
*}
  
{*danrodcha ivamenjim migtermor dancorgar marpoldia1 ferrenseg wilmorort paupeddeg pablucoto crigomgom anaprarod serrodcal juacabsou rubgonmar josgarsan fraortmoy lucnovdos*}
+
(* danrodcha ivamenjim migtermor dancorgar marpoldia1 ferrenseg
 +
  wilmorort paupeddeg pablucoto crigomgom anaprarod serrodcal juacabsou
 +
  rubgonmar josgarsan fraortmoy lucnovdos pabrodmac marcarmor13 jeamacpov antsancab1*
 
fun algunos  :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
 
fun algunos  :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
  "algunos p []    = False"
+
  "algunos p []    = False"
 
| "algunos p (x#xs) = (p x ∨ algunos p xs)"
 
| "algunos p (x#xs) = (p x ∨ algunos p xs)"
 +
 +
(* fracorjim1. En esta versión el procesamiento se detiene al encontrar
 +
  una coincidencia *)
 +
fun algunos2  :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
 +
  "algunos2 p [] = False"
 +
| "algunos2 p (x#xs) = (if p x then True else algunos2 p xs)"
  
 
text {*
 
text {*
Línea 54: Línea 60:
 
*}
 
*}
  
{*danrodcha ivamenjim migtermor dancorgar marpoldia1 ferrenseg wilmorort paupeddeg pablucoto anaprarod serrodcal juacabsou rubgonmar josgarsan fraortmoy lucnovdos*}
+
(* danrodcha ivamenjim migtermor dancorgar marpoldia1 ferrenseg
 +
  wilmorort paupeddeg pablucoto anaprarod serrodcal juacabsou rubgonmar
 +
  josgarsan fraortmoy lucnovdos pabrodmac marcarmor13 jeamacpov antsancab1 *
 
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 
by (induct xs) auto
 
by (induct xs) auto
 +
 +
(* fracorjim1 *)
 +
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 +
apply (induct xs)
 +
apply auto
 +
done
  
 
text {*
 
text {*
Línea 65: Línea 79:
 
*}
 
*}
  
{*danrodcha*}
+
(* danrodcha fracorjim1 *)
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
+
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)" (is "?R xs")
 
proof (induct xs)
 
proof (induct xs)
 
   show "?R []" by simp
 
   show "?R []" by simp
Línea 72: Línea 86:
 
   fix a xs  
 
   fix a xs  
 
   assume HI: "?R xs"
 
   assume HI: "?R xs"
   have "todos (λx. P x ∧ Q x) (a#xs) = (P a ∧ Q a ∧ todos (λx. P x ∧ Q x) xs)" by simp
+
   have "todos (λx. P x ∧ Q x) (a#xs) =  
   also have "… = (P a ∧ Q a ∧ (todos P xs ∧ todos Q xs))" using HI by simp
+
        (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
 
   also have "… = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))" by blast
 
   also have "… = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))" by blast
 
   also have "… = (todos P (a#xs) ∧ todos Q (a#xs))" by simp
 
   also have "… = (todos P (a#xs) ∧ todos Q (a#xs))" by simp
 
   finally show "?R (a#xs)" by simp
 
   finally show "?R (a#xs)" by simp
 
qed
 
qed
 +
 +
(* Comentario: Uso de blast. *)
  
 
(* ivamenjim wilmorort serrodcal josgarsan*)
 
(* ivamenjim wilmorort serrodcal josgarsan*)
 
 
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 
proof (induct xs)
 
proof (induct xs)
Línea 87: Línea 104:
 
   fix a xs
 
   fix a xs
 
   assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q 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
+
   have "todos (λx. P x ∧ Q x) (a # xs) =  
   also have "... = (P a ∧ Q a ∧ todos P xs ∧ todos Q xs)" using HI by simp
+
        (P a ∧ Q a ∧ todos (λx. P x ∧ Q x) xs)" by simp
   finally show "todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))" by auto
+
   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
 
qed
 +
 +
(* Comentario: Uso de auto. *)
  
 
(* dancorgar paupeddeg *)
 
(* dancorgar paupeddeg *)
Línea 99: Línea 121:
 
   fix y xs
 
   fix y xs
 
   assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 
   assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
   have "todos (λx. P x ∧ Q x) (y#xs) = ((P y ∧ Q y) ∧ (todos (λx. P x ∧ Q x) xs))" by simp
+
   have "todos (λx. P x ∧ Q x) (y#xs) =  
   also have "… = ((P y ∧ Q y) ∧ (todos P xs ∧ todos Q xs))" using HI by simp
+
        ((P y ∧ Q y) ∧ (todos (λx. P x ∧ Q x) xs))" by simp
 +
   also have "… = ((P y ∧ Q y) ∧ (todos P xs ∧ todos Q xs))"  
 +
    using HI by simp
 
   also have "… = ((P y ∧ todos P xs) ∧ (Q y ∧ todos Q xs))" by blast
 
   also have "… = ((P y ∧ todos P xs) ∧ (Q y ∧ todos Q xs))" by blast
 
   also have "… = ((todos P (y#xs)) ∧ (todos Q (y#xs)))" by simp
 
   also have "… = ((todos P (y#xs)) ∧ (todos Q (y#xs)))" by simp
   finally show "todos (λx. P x ∧ Q x) (y#xs) = (todos P (y#xs) ∧ todos Q (y#xs))" by simp
+
   finally show "todos (λx. P x ∧ Q x) (y#xs) =  
 +
                (todos P (y#xs) ∧ todos Q (y#xs))" by simp
 
qed
 
qed
 
  
 
(* migtermor *)
 
(* migtermor *)
Línea 114: Línea 138:
 
  fix x xs
 
  fix x xs
 
  assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 
  assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
  have "(todos (λx. P x ∧ Q x) (x#xs)) = (( P x ∧ Q x) ∧ (todos (λx. P x ∧ Q x) xs))"
+
  have "(todos (λx. P x ∧ Q x) (x#xs)) =  
    by (simp only: todos.simps(2))
+
      (( P x ∧ Q x) ∧ (todos (λx. P x ∧ Q x) xs))"
  also have "… = ((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs))" using HI by simp
+
  by (simp only: todos.simps(2))
  also have "… = (((P x)(todos P xs)) ∧ ((Q x) (todos Q xs)))" by arith
+
  also have "… = ((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs))"  
 +
  using HI by simp
 +
  also have "… = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))"  
 +
  by arith
 
  also have "((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs)) = (((P x)∧(todos P xs)) ∧ ((Q x) ∧ (todos Q xs)))"
 
  also have "((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs)) = (((P x)∧(todos P xs)) ∧ ((Q x) ∧ (todos Q xs)))"
          by arith (* Este paso es exactamente el mismo que el anterior, pero sin cualquiera de los dos no funciona el "finally show" *)
+
  by arith  
 +
  (* Este paso es exactamente el mismo que el anterior, pero sin
 +
      cualquiera de los dos no funciona el "finally show" *)  
 
  have "… = (((P x)∧(todos P xs))∧((Q x)∧(todos Q xs)))" by simp
 
  have "… = (((P x)∧(todos P xs))∧((Q x)∧(todos Q xs)))" by simp
 
  have "… = ((todos P (x#xs))∧(todos Q (x#xs)))" by simp
 
  have "… = ((todos P (x#xs))∧(todos Q (x#xs)))" by simp
  finally show "(todos (λx. P x ∧ Q x) (x#xs)) = ((todos P (x#xs)) ∧ (todos Q (x#xs)))" by simp  
+
  finally show "(todos (λx. P x ∧ Q x) (x#xs)) =  
 +
              ((todos P (x#xs)) ∧ (todos Q (x#xs)))" by simp  
 
qed
 
qed
 +
 +
(* Comentarios: Ruptura de la cadena de igualdades y uso de arith. *)
  
 
(* marpoldia1 *)
 
(* marpoldia1 *)
Línea 132: Línea 164:
 
   fix a xs
 
   fix a xs
 
   assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q 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 P xs ∧ todos Q xs))" using HI by simp
+
   have "todos (λx. P x ∧ Q x) (a # xs) =   
 +
        ((P a ∧ Q a) ∧ (todos P xs ∧ todos Q xs))" using HI by simp
 
   also have "... = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))" by blast
 
   also have "... = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))" by blast
 
   also have "... = (todos P (a#xs) ∧ todos Q (a#xs)) " by simp
 
   also have "... = (todos P (a#xs) ∧ todos Q (a#xs)) " by simp
  finally show "todos (λx. P x ∧ Q x) (a#xs) = (todos P (a#xs) ∧ todos Q (a#xs))" by simp  
+
  finally show "todos (λx. P x ∧ Q x) (a#xs) =  
 +
              (todos P (a#xs) ∧ todos Q (a#xs))" by simp  
 
qed
 
qed
  
 
(* ferrenseg *)
 
(* ferrenseg *)
 
 
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 
proof (induct xs)
 
proof (induct xs)
Línea 146: Línea 179:
 
   fix n xs
 
   fix n xs
 
   assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 
   assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
   have "todos (λx. P x ∧ Q x) (n # xs) = (P n ∧ Q n ∧ todos P xs ∧ todos Q xs)" using HI by simp
+
   have "todos (λx. P x ∧ Q x) (n # xs) =  
 +
        (P n ∧ Q n ∧ todos P xs ∧ todos Q xs)" using HI by simp
 
   also have "… = P n ∧ Q n ∧ todos P xs ∧ todos Q xs" by blast
 
   also have "… = P n ∧ Q n ∧ todos P xs ∧ todos Q xs" by blast
 
   also have "⋯ = todos P (n # xs) ∧ todos Q (n # xs)" by simp  
 
   also have "⋯ = todos P (n # xs) ∧ todos Q (n # xs)" by simp  
 
   finally show "todos (λx. P x ∧ Q x) (n # xs) = todos P (n # xs) ∧ todos Q (n # xs)" by simp
 
   finally show "todos (λx. P x ∧ Q x) (n # xs) = todos P (n # xs) ∧ todos Q (n # xs)" by simp
 +
oops
 +
 +
(* Comentario: Demostración incompleta. *)
 +
 +
(* lucnovdos *)
 +
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 n xs
 +
  assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 +
  have "todos (λx. P x ∧ Q x) (n # xs) = 
 +
        ((P n ∧ Q n) ∧ (todos P xs ∧ todos Q xs))" using HI by simp
 +
  also have "... = ((P n ∧ todos P xs) ∧ (Q n ∧ todos Q xs))" by arith
 +
  also have "... = ((todos P(n#xs)) ∧ (todos Q(n#xs)))" by simp
 +
finally show "todos (λx. P x ∧ Q x) (n#xs) =
 +
              (todos P (n#xs) ∧ todos Q (n#xs))" by simp
 
qed
 
qed
  
{* wilmorort pablucoto crigomgom anaprarod juacabsou rubgonmar fraortmoy *}
+
(* wilmorort pablucoto crigomgom anaprarod juacabsou rubgonmar fraortmoy
 +
  marcarmor13 jeamacpov *)
 +
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
 +
  also have "... = (P a ∧ todos P xs ∧ Q a ∧ todos Q xs)"  by arith
 +
  also have "... = (todos P (a # xs) ∧ todos Q (a # xs))" by simp
 +
    (* Este paso se puede obviar *)
 +
  finally show "todos (λx. P x ∧ Q x) (a # xs) =
 +
                (todos P (a # xs) ∧ todos Q (a # xs))" by simp
 +
qed
  
 +
(* pabrodmac *)
 
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 
proof (induct xs)
 
proof (induct xs)
show "todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])" by simp   
+
  show "todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])" by simp
 +
next
 +
  fix x xs
 +
  assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 +
  have "todos (λx. P x ∧ Q x) (x#xs) =
 +
        (P x ∧ Q x  ∧ todos (λx. P x ∧ Q x) xs)" by simp
 +
  also have "... = (P x ∧ Q x  ∧ (todos P xs ∧ todos Q xs))"
 +
    using HI by simp
 +
  also have "... = (P x ∧ todos P xs ∧ Q x ∧ todos Q xs)"  by arith
 +
  finally show "todos (λx. P x ∧ Q x) (x#xs) =
 +
                (todos P (x#xs) ∧ todos Q (x#xs))" by simp
 +
qed
 +
 
 +
(* antsancab1 *)
 +
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)" (is "?R xs")
 +
proof (induct xs)
 +
   show "?R []" by simp
 
next
 
next
fix a xs
+
  fix a xs
assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
+
  assume HI: "?R xs"
have "todos (λx. P x ∧ Q x) (a # xs) = (P a ∧ Q a ∧ todos (λx. P x ∧ Q x) xs)" by simp
+
  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
+
  also have "... = (P a ∧ Q a ∧ todos P xs ∧ todos Q xs)" using HI by simp
also have "... = (P a ∧ todos P xs ∧ Q a ∧ todos Q xs)"  by arith
+
   finally show "todos (λx. P x ∧ Q x) (a # xs) = (todos P (a#xs) ∧ todos Q (a#xs))" by auto
also have "... = (todos P (a # xs) ∧ todos Q (a # xs))" by simp (* Este paso se puede obviar*)
+
qe
   finally show "todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))" by simp
 
qed
 
  
 
text {*
 
text {*
Línea 173: Línea 256:
 
   ---------------------------------------------------------------------  
 
   ---------------------------------------------------------------------  
 
*}
 
*}
{*danrodcha ivamenjim marpoldia1 migtermor ferrenseg wilmorort paupeddeg crigomgom anaprarod serrodcal juacabsou rubgonmar pablucoto fraortmoy *}
+
 
 +
(* danrodcha ivamenjim marpoldia1 migtermor ferrenseg wilmorort
 +
  paupeddeg crigomgom anaprarod serrodcal juacabsou rubgonmar pablucoto
 +
  fraortmoy josgarsan lucnovdos pabrodmac marcarmor13 jeamacpov antsancab1 *)
 
lemma "todos P (x @ y) = (todos P x ∧ todos P y)"
 
lemma "todos P (x @ y) = (todos P x ∧ todos P y)"
 
by (induct x) auto
 
by (induct x) auto
  
{* anaprarod dancorgar *}
+
(* anaprarod dancorgar fracorjim1 *)
 
lemma "todos P (x @ y) = (todos P x ∧ todos P y)"
 
lemma "todos P (x @ y) = (todos P x ∧ todos P y)"
 
apply (induct x)
 
apply (induct x)
Línea 190: Línea 276:
 
*}
 
*}
  
(* ivamenjim ferrenseg wilmorort dancorgar fraortmoy *)
+
(* ivamenjim ferrenseg wilmorort dancorgar fraortmoy josgarsan lucnovdos
 
+
rubgonmar *)  
 
lemma todos_append:
 
lemma todos_append:
 
   "todos P (x @ y) = (todos P x ∧ todos P y)"
 
   "todos P (x @ y) = (todos P x ∧ todos P y)"
Línea 201: Línea 287:
 
   have "todos P ((a#x) @ y) = (P a ∧ (todos P (x @ y)))" by simp
 
   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
 
   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
 
qed
  
(* migtermor serrodcal *)
+
(* migtermor serrodcal antsancab1 *)
 
 
 
lemma todos_append1:
 
lemma todos_append1:
 
   "todos P (x @ y) = (todos P x ∧ todos P y)" (is "?P x")
 
   "todos P (x @ y) = (todos P x ∧ todos P y)" (is "?P x")
 
proof (induct x)
 
proof (induct x)
show "?P []" by simp
+
  show "?P []" by simp
 
next  
 
next  
fix a x
+
  fix a x
assume HI: "?P x"
+
  assume HI: "?P x"
have "todos P ((a#x) @ y) = (P a ∧ (todos P (x @ y)))" by simp
+
  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
+
  also have "… = (P a ∧ (todos P x ∧ todos P y))" using HI by simp
finally show "?P (a#x)" by simp
+
  finally show "?P (a#x)" by simp
 
qed   
 
qed   
  
 
(* marpoldia1 *)
 
(* marpoldia1 *)
lemma todos_append:
+
lemma todos_append2:
 
   "todos P (x @ y) = (todos P x ∧ todos P y)"
 
   "todos P (x @ y) = (todos P x ∧ todos P y)"
 
proof (induct x)
 
proof (induct x)
Línea 229: Línea 315:
 
   also have "... = (P a ∧ todos P (x @ y))" by simp
 
   also have "... = (P a ∧ todos P (x @ y))" by simp
 
   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
 
qed
  
Línea 242: Línea 329:
 
   have "todos P ((a # x) @ y) = todos P (a # (x @ y))" by simp
 
   have "todos P ((a # x) @ y) = todos P (a # (x @ y))" by simp
 
   also have "... = (todos P [a] ∧ todos P (x @ y)) " by simp
 
   also have "... = (todos P [a] ∧ todos P (x @ y)) " by simp
   also have "... = (todos P [a] ∧ (todos P x ∧ todos P y))" using HI by simp
+
   also have "... = (todos P [a] ∧ (todos P x ∧ todos P y))"  
   finally show "todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)" by simp
+
    using HI by simp
 +
   finally show "todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)"  
 +
    by simp
 
qed
 
qed
  
 
(* crigomgom juacabsou anaprarod*)
 
(* crigomgom juacabsou anaprarod*)
 
 
lemma todos_append4:
 
lemma todos_append4:
 
   "todos P (x @ y) = (todos P x ∧ todos P y)"
 
   "todos P (x @ y) = (todos P x ∧ todos P y)"
Línea 258: Línea 346:
 
   also have "... = (P x ∧ (todos P xs ∧ todos P y)) " using HI by simp
 
   also have "... = (P x ∧ (todos P xs ∧ todos P y)) " using HI by simp
 
   also have "... = ((P x ∧ todos P xs) ∧ todos P y)" by simp
 
   also have "... = ((P x ∧ todos P xs) ∧ todos P y)" by simp
   finally show "todos P ((x # xs) @ y) = (todos P (x # xs) ∧ todos P y)" by simp
+
   finally show "todos P ((x # xs) @ y) = (todos P (x # xs) ∧ todos P y)"  
 +
    by simp
 
qed
 
qed
  
(* pablucoto *)
+
(* pablucoto marcarmor13 jeamacpov *)
 
lemma todos_append5:
 
lemma todos_append5:
 
   "todos P (x @ y) = (todos P x ∧ todos P y)"
 
   "todos P (x @ y) = (todos P x ∧ todos P y)"
Línea 272: Línea 361:
 
   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
 
   also have "... = (todos P (a#x) ∧ todos P y)" by simp
 
   also have "... = (todos P (a#x) ∧ todos P y)" by simp
   finally show "todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)" by auto
+
   finally show "todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)"  
   qed
+
    by auto
 +
qed
 +
 
 +
(* Comentario: Uso de auto. *)
 +
 
 +
(* danrodcha fracorjim1 *)
 +
lemma todos_append6:
 +
  "todos P (x @ y) = (todos P x ∧ todos P y)" (is "?Q x")
 +
proof (induct x)
 +
  show "?Q []" by simp
 +
next
 +
fix x a assume HI: "?Q x"
 +
  have "todos P ((a # x) @ y) = todos P (a # x @ y)" by simp
 +
  also have "… = ((P a) ∧ todos P (x @ y))" by simp
 +
  also have "… = ((P a) ∧ (todos P x ∧ todos P y))" using HI by simp
 +
   also have "… = (todos P (a # x) ∧ todos P y)" by simp
 +
  finally show "?Q (a # x)" by simp
 +
qed
 +
 
 +
(* pabrodmac *)
 +
lemma todos_append7:
 +
  "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
  
 
text {*
 
text {*
Línea 282: Línea 402:
 
*}
 
*}
  
lemma "todos P (rev xs) = todos P xs"
+
(* migtermor ivamenjim marpoldia1 serrodcal anaprarod paupeddeg
oops
+
  dancorgar antsancab1 fracorjim1 *)  
 
 
(* migtermor ivamenjim marpoldia1 serrodcal anaprarod *)
 
 
lemma "todos P (rev xs) = todos P xs"  
 
lemma "todos P (rev xs) = todos P xs"  
 
apply (induct xs)
 
apply (induct xs)
Línea 293: Línea 411:
 
done
 
done
  
(* ferrenseg crigomgom rubgonmar fraortmoy *)
+
(* ferrenseg crigomgom rubgonmar fraortmoy josgarsan danrodcha lucnovdos
 
+
  pabrodmac *)  
 
lemma "todos P (rev xs) = todos P xs"
 
lemma "todos P (rev xs) = todos P xs"
 
by (induct xs) (auto simp add: todos_append)
 
by (induct xs) (auto simp add: todos_append)
Línea 300: Línea 418:
 
(* wilmorort *)
 
(* wilmorort *)
 
lemma "todos P (rev xs) = todos P xs"
 
lemma "todos P (rev xs) = todos P xs"
by (induct xs,simp,simp add: todos_append,auto)
+
by (induct xs, simp, simp add: todos_append,auto)
 +
 
 +
(* Comentario: Pasos dentro de by *)
  
 
(* juacabsou *)
 
(* juacabsou *)
 
lemma "todos P (rev xs) = todos P xs"
 
lemma "todos P (rev xs) = todos P xs"
apply (induct xs,simp,simp add: todos_append,auto) done
+
apply (induct xs, simp, simp add: todos_append, auto)  
 +
done
 +
 
 +
(* Comentario: Pasos dentro de apply *)
  
(* dancorgar *)
+
(* pablucoto marcarmor13 jeamacpov *)
 
lemma "todos P (rev xs) = todos P xs"
 
lemma "todos P (rev xs) = todos P xs"
apply (induct xs)
+
by (induct xs) (auto, simp_all add: todos_append)  
apply (simp add: todos_append)
 
apply (simp add: todos_append)
 
apply auto
 
done
 
  
(* pablucoto * )
+
(* Comentario: Uso de simp_all *)
 +
 
 
lemma "todos P (rev xs) = todos P xs"
 
lemma "todos P (rev xs) = todos P xs"
  by (induct xs) (auto, simp_all add: todos_append)
+
by (induct xs) (simp_all add: todos_append, auto)
lemma "todos P (rev xs) = todos P xs"
 
  by (induct xs) ( simp_all add: todos_append, auto)
 
  
 +
(* Comentario: Uso de add en simp_all *) 
 +
 
 
text {*
 
text {*
 
   ---------------------------------------------------------------------  
 
   ---------------------------------------------------------------------  
Línea 326: Línea 446:
 
   ---------------------------------------------------------------------  
 
   ---------------------------------------------------------------------  
 
*}
 
*}
 
lemma "todos P (rev xs) = todos P xs"
 
oops
 
  
 
(* migtermor *)
 
(* migtermor *)
 
 
lemma auxiliar:
 
lemma auxiliar:
 
  "rev (a#xs) = rev xs @ [a]"
 
  "rev (a#xs) = rev xs @ [a]"
Línea 338: Línea 454:
 
lemma "todos P (rev xs) = todos P xs" (is "?Q xs")
 
lemma "todos P (rev xs) = todos P xs" (is "?Q xs")
 
proof (induct xs)
 
proof (induct xs)
show "?Q []" by (simp only: rev.simps(1))
+
  show "?Q []" by (simp only: rev.simps(1))
 
next  
 
next  
fix a xs
+
  fix a xs
assume HI: "?Q xs"
+
  assume HI: "?Q xs"
have "todos P (rev (a#xs)) = (todos P (rev xs @ [a]))" by (simp add: auxiliar)
+
  have "todos P (rev (a#xs)) = (todos P (rev xs @ [a]))"  
have "… = ((todos P (rev xs)) ∧ (todos P [a]))" by (simp add: todos_append)
+
    by (simp add: "auxiliar")
have "… =  (todos P (rev xs) ∧ P a)" by simp
+
  have "… = ((todos P (rev xs)) ∧ (todos P [a]))"  
also have Aux: "… = (todos P xs ∧ P a)" using HI by simp
+
    by (simp add: todos_append)
have Aux1: "… = (P a ∧ todos P xs)" by arith
+
  have "… =  (todos P (rev xs) ∧ P a)" by simp
have "(todos P (rev xs) ∧ P a) = (P a ∧ todos P xs)" using Aux Aux1 by simp
+
  also have Aux: "… = (todos P xs ∧ P a)" using HI by simp
finally show "todos P (rev (a#xs)) = todos P (a#xs)" by (simp add: todos_append)
+
  have Aux1: "… = (P a ∧ todos P xs)" by arith
 +
  have "(todos P (rev xs) ∧ P a) = (P a ∧ todos P xs)"  
 +
    using Aux Aux1 by simp
 +
  finally show "todos P (rev (a#xs)) = todos P (a#xs)"  
 +
    by (simp add: todos_append)
 
qed
 
qed
  
 +
(* Comentarios:
 +
  + Ruptura de cadena de igualdades.
 +
  + Uso de hechos auxiliares
 +
  + Uso de arith
 +
*) 
  
(* marpoldia1 ferrenseg crigomgom serrodcal juacabsou rubgonmar *)
+
(* marpoldia1 ferrenseg crigomgom serrodcal juacabsou rubgonmar
 +
  josgarsan pablucoto pabrodmac lucnovdos marcarmor13 jeamacpov *)  
 
lemma "todos P (rev xs) = todos P xs"
 
lemma "todos P (rev xs) = todos P xs"
 
proof (induct xs)
 
proof (induct xs)
Línea 360: Línea 486:
 
   assume HI: "todos P (rev xs) = todos P xs"
 
   assume HI: "todos P (rev xs) = todos P xs"
 
   have "todos P (rev (a # xs)) = (todos P ((rev xs)@[a]))" by simp
 
   have "todos P (rev (a # xs)) = (todos P ((rev xs)@[a]))" by simp
   also have "... = (todos P (rev xs) ∧ todos P [a])" by (simp add:todos_append)
+
   also have "... = (todos P (rev xs) ∧ todos P [a])"  
 +
    by (simp add:todos_append)
 
   also have "... = (todos P xs ∧ P a)" using HI by simp
 
   also have "... = (todos P xs ∧ P a)" using HI by simp
 
   also have "... = (P a ∧ todos P xs)" by arith
 
   also have "... = (P a ∧ todos P xs)" by arith
Línea 368: Línea 495:
  
 
(* ivamenjim *)
 
(* ivamenjim *)
 
 
lemma "todos P (rev xs) = todos P xs" (is "?P xs")
 
lemma "todos P (rev xs) = todos P xs" (is "?P xs")
 
proof (induct xs)
 
proof (induct xs)
Línea 376: Línea 502:
 
   assume HI: "?P xs"
 
   assume HI: "?P xs"
 
   have "todos P (rev (a # xs)) = (todos P ((rev xs)@[a]))" by simp
 
   have "todos P (rev (a # xs)) = (todos P ((rev xs)@[a]))" by simp
   also have "... = ((todos P (rev xs)) ∧ todos P [a])" by (simp add: todos_append)
+
   also have "... = ((todos P (rev xs)) ∧ todos P [a])"  
 +
    by (simp add: todos_append)
 
   also have "... = (todos P xs ∧ todos P [a])" using HI by simp
 
   also have "... = (todos P xs ∧ todos P [a])" using HI by simp
 
   also have "... = (todos P [a] ∧ todos P xs)" by arith
 
   also have "... = (todos P [a] ∧ todos P xs)" by arith
Línea 382: Línea 509:
 
qed
 
qed
  
(* fraortmoy *)
+
(* fraortmoy serrodcal *)
 
 
 
lemma "todos P (rev xs) = todos P xs"
 
lemma "todos P (rev xs) = todos P xs"
 
proof (induct xs)
 
proof (induct xs)
Línea 391: Línea 517:
 
   assume H1: "todos P (rev xs) = todos P xs"
 
   assume H1: "todos P (rev xs) = todos P xs"
 
   have " todos P (rev (a # xs)) = todos P (rev xs @ [a])" by simp
 
   have " todos P (rev (a # xs)) = todos P (rev xs @ [a])" by simp
   also have "… = (todos P (rev xs) ∧ todos P [a])" by (simp add:todos_append)
+
   also have "… = (todos P (rev xs) ∧ todos P [a])"  
 +
    by (simp add:todos_append)
 
   also have "… = (todos P xs ∧ todos P [a])" using H1 by simp
 
   also have "… = (todos P xs ∧ todos P [a])" using H1 by simp
 
   also have "… = (todos P [a] ∧ todos P xs)" by arith
 
   also have "… = (todos P [a] ∧ todos P xs)" by arith
Línea 405: Línea 532:
 
   assume HI: "todos P (rev xs) = todos P xs "
 
   assume HI: "todos P (rev xs) = todos P xs "
 
   have "todos P (rev (a # xs)) = todos P (rev(xs) @ [a])" by simp
 
   have "todos P (rev (a # xs)) = todos P (rev(xs) @ [a])" by simp
   also have "... = (todos P (rev xs) ∧ todos P [a]) " by (simp add: todos_append)
+
   also have "... = (todos P (rev xs) ∧ todos P [a]) "  
 +
    by (simp add: todos_append)
 
   also have "... = (todos P xs ∧ todos P [a])" using HI by simp
 
   also have "... = (todos P xs ∧ todos P [a])" using HI by simp
 
   also have "... = (todos P [a] ∧ todos P xs)" by arith
 
   also have "... = (todos P [a] ∧ todos P xs)" by arith
Línea 415: Línea 543:
 
lemma "todos P (rev xs) = todos P xs" (is "?P xs")
 
lemma "todos P (rev xs) = todos P xs" (is "?P xs")
 
proof (induct xs)  
 
proof (induct xs)  
show "?P []" by simp  
+
  show "?P []" by simp  
 
next
 
next
fix a xs
+
  fix a xs
assume HI: "?P xs"
+
  assume HI: "?P xs"
have "todos P (rev (a#xs)) = todos P ((rev xs) @ [a])" by simp
+
  have "todos P (rev (a#xs)) = todos P ((rev xs) @ [a])" by simp
also have "... = (todos P(rev xs) ∧ todos P [a])" by (simp add: todos_append)
+
  also have "... = (todos P(rev xs) ∧ todos P [a])"  
also have "... = (todos P xs ∧ todos P [a])" using HI by simp
+
    by (simp add: todos_append)
also have "... = (todos P [a] ∧ todos P xs)" by (simp add: HOL.conj_commute)
+
  also have "... = (todos P xs ∧ todos P [a])" using HI by simp
also have "... = todos P([a]@(xs))" by (simp)
+
  also have "... = (todos P [a] ∧ todos P xs)"  
finally show  "todos P (rev (a#xs))= todos P (a # xs)" by simp
+
    by (simp add: HOL.conj_commute)
 +
  also have "... = todos P([a]@(xs))" by (simp)
 +
  finally show  "todos P (rev (a#xs))= todos P (a # xs)" by simp
 
qed
 
qed
  
(* anaprarod *)   
+
(* Comentario: Uso de HOL.conj_commute *)
 +
 
 +
(* anaprarod fracorjim1 *)   
 
(* es igual que las anteriores pero con el final también con patrones *)
 
(* es igual que las anteriores pero con el final también con patrones *)
 
 
lemma "todos P (rev xs) = todos P xs" (is "?P xs")
 
lemma "todos P (rev xs) = todos P xs" (is "?P xs")
 
proof (induct xs)
 
proof (induct xs)
Línea 437: Línea 568:
 
   assume HI: "?P xs"
 
   assume HI: "?P xs"
 
   have "todos P (rev (a#xs)) = todos P (rev xs @ [a])" by simp
 
   have "todos P (rev (a#xs)) = todos P (rev xs @ [a])" by simp
   also have "… = (todos P (rev xs) ∧ todos P [a])" by (simp add: todos_append)
+
   also have "… = (todos P (rev xs) ∧ todos P [a])"  
 +
    by (simp add: todos_append)
 
   also have "… = (todos P xs ∧ todos P [a])" using HI by simp
 
   also have "… = (todos P xs ∧ todos P [a])" using HI by simp
 
   also have "… = (todos P [a] ∧ todos P xs)" by arith
 
   also have "… = (todos P [a] ∧ todos P xs)" by arith
 
   also have "… = todos P (a#xs)" by simp
 
   also have "… = todos P (a#xs)" by simp
 
   finally show "?P (a # xs)" by simp
 
   finally show "?P (a # xs)" by simp
 +
qed
 +
 +
(* danrodcha *)
 +
lemma "todos P (rev xs) = todos P xs" (is "?Q xs")
 +
proof (induct xs)
 +
  show "?Q []" by simp
 +
next
 +
  fix a xs assume HI: "?Q xs"
 +
  have "todos P (rev (a#xs)) = todos P ((rev xs) @ [a])" by simp
 +
  also have "… = (todos P (rev xs) ∧ todos P [a])"
 +
    by (simp add:todos_append)
 +
  also have "… = (todos P xs ∧ todos P [a])" using HI by simp
 +
  also have "… = (todos P [a] ∧ todos P xs)"
 +
    by (simp add: HOL.conj_commute)
 +
  also have "… = todos P (a # xs)" by simp
 +
  finally show "?Q (a # xs)" by simp
 +
qed
 +
 +
(* antsancab1 *)
 +
lemma "todos P (rev xs) = todos P xs"
 +
proof (induct xs)
 +
  show "todos P (rev[]) = todos P[]" by simp
 +
next
 +
  fix a xs
 +
  assume HI: "todos P (rev xs) = todos P xs"
 +
  have "todos P (rev(a#xs)) = todos P (rev xs @ [a])" by simp
 +
  also have "... = (todos P (rev xs) ∧ todos P [a])" by (simp add: todos_append)
 +
  also have "... = (todos P xs ∧ todos P [a])" using HI by simp
 +
  also have "... = (todos P [a] ∧ todos P xs)" by arith
 +
  also have "... = (todos P ([a] @ xs))" by (simp add: todos_append)
 +
  also have "... = (todos P (a#xs))" by simp
 +
  finally show "todos P (rev (a # xs)) = todos P (a # xs)" by simp
 
qed
 
qed
  
Línea 454: Línea 618:
 
oops
 
oops
  
(* migtermor ivamenjim ferrenseg paupeddeg crigomgom serrodcal wilmorort juacabsou rubgonmar anaprarod marpoldia1 fraortmoy *)
+
(* migtermor ivamenjim ferrenseg paupeddeg crigomgom serrodcal wilmorort
 +
  juacabsou rubgonmar anaprarod marpoldia1 fraortmoy josgarsan
 +
  danrodcha pablucoto lucnovdos marcarmor13 jeamacpov antsancab1 fracorjim1 pabrodmac *)
 
lemma "algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)"  
 
lemma "algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)"  
 
quickcheck
 
quickcheck
 
oops
 
oops
(* Quickcheck encuentra el siguiente contraejemplo: P={a1}, Q={a2}, xs={a1,a2}. En este ejemplo:
+
(* Quickcheck encuentra el siguiente contraejemplo:  
 +
      P={a1}, Q={a2}, xs={a1,a2}.  
 +
  En este ejemplo:
 
   · "algunos (λx. P x ∧ Q x) xs = False"
 
   · "algunos (λx. P x ∧ Q x) xs = False"
 
   · "(algunos P xs ∧ algunos Q xs) = True" *)
 
   · "(algunos P xs ∧ algunos Q xs) = True" *)
 +
 +
(* dancorgar *)
 +
lemma "algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)"
 +
proof -
 +
  assume H1: "xs = [a, b]"
 +
  assume H2: "P a = True"
 +
  assume H3: "Q a = False"
 +
  assume H4: "P b = False"
 +
  assume H5: "Q b = True"
 +
  have F1: "(algunos P xs ∧ algunos Q xs) = True"
 +
    using H1 H2 H3 H4 H5 by simp
 +
  have F2: "algunos (λx. P x ∧ Q x) xs = False"
 +
    using H1 H2 H3 H4 H5 by simp
 +
  have "algunos (λx. P x ∧ Q x) xs ≠ (algunos P xs ∧ algunos Q xs)"
 +
    using F1 F2 by simp
 +
oops
  
 
text {*
 
text {*
Línea 469: Línea 653:
 
*}
 
*}
  
(* ivamenjim migtermor marpoldia1 crigomgom rubgonmar wilmorort anaprarod fraortmoy juacabsou *)
+
(* ivamenjim migtermor marpoldia1 crigomgom rubgonmar wilmorort anaprarod  
 
+
  fraortmoy juacabsou paupeddeg josgarsan danrodcha pablucoto lucnovdos
 +
  marcarmor13 jeamacpov antsancab1 pabrodmac *)  
 
lemma "algunos P (map f xs) = algunos (P o f) xs"
 
lemma "algunos P (map f xs) = algunos (P o f) xs"
 
by (induct xs) auto
 
by (induct xs) auto
  
 
(* ferrenseg *)
 
(* ferrenseg *)
 
 
lemma "algunos P (map f xs) = algunos (P o f) xs"
 
lemma "algunos P (map f xs) = algunos (P o f) xs"
 
by (induct xs) simp_all
 
by (induct xs) simp_all
  
(* anaprarod *)
+
(* anaprarod dancorgar serrodcal fracorjim1 *)
 
lemma "algunos P (map f xs) = algunos (P o f) xs"
 
lemma "algunos P (map f xs) = algunos (P o f) xs"
 
apply (induct xs)
 
apply (induct xs)
Línea 487: Línea 671:
 
text {*
 
text {*
 
   ---------------------------------------------------------------------  
 
   ---------------------------------------------------------------------  
   Ejercicio 7.2. Demostrar o refutar datalladamente
+
   Ejercicio 7.2. Demostrar o refutar detalladamente
 
     algunos P (map f xs) = algunos (P ∘ f) xs
 
     algunos P (map f xs) = algunos (P ∘ f) xs
 
   ---------------------------------------------------------------------  
 
   ---------------------------------------------------------------------  
 
*}
 
*}
 
lemma "algunos P (map f xs) = algunos (P o f) xs"
 
oops
 
  
 
(* migtermor *)
 
(* migtermor *)
 
 
lemma AUX: "algunos (λa. P (f a)) xs = algunos (P o f) xs"
 
lemma AUX: "algunos (λa. P (f a)) xs = algunos (P o f) xs"
 
by (induct xs) auto
 
by (induct xs) auto
Línea 502: Línea 682:
 
lemma "algunos P (map f xs) = algunos (P o f) xs" (is "?Q xs")
 
lemma "algunos P (map f xs) = algunos (P o f) xs" (is "?Q xs")
 
proof (induct xs)
 
proof (induct xs)
show "?Q []" by simp
+
  show "?Q []" by simp
 
next
 
next
fix x xs
+
  fix x xs
assume HI: "?Q xs"
+
  assume HI: "?Q xs"
have "algunos P (map f (x#xs)) = (algunos P ((f x)#(map f xs)))" by simp
+
  have "algunos P (map f (x#xs)) = (algunos P ((f x)#(map f xs)))"  
also have "… = ((P (f x)) ∨ (algunos P (map f xs)))" by (simp only: algunos.simps(2))
+
    by simp
also have "… = ((P (f x)) ∨ (algunos (P o f) xs))"  
+
  also have "… = ((P (f x)) ∨ (algunos P (map f xs)))"  
  proof (cases)
+
    by (simp only: algunos.simps(2))
 +
  also have "… = ((P (f x)) ∨ (algunos (P o f) xs))"  
 +
  proof (cases)
 
     assume C1: "(P (f x))"
 
     assume C1: "(P (f x))"
     have Aux: "((P (f x)) ∨ (algunos P (map f xs))) = True" using C1 by simp
+
     have Aux: "((P (f x)) ∨ (algunos P (map f xs))) = True"  
     have  Aux1: "… = ((P (f x)) ∨ (algunos (P o f) xs))" using C1 by simp
+
      using C1 by simp
     then show "((P (f x)) ∨ (algunos P (map f xs))) = ((P (f x)) ∨ (algunos (P o f) xs))"  
+
     have  Aux1: "… = ((P (f x)) ∨ (algunos (P o f) xs))"  
              using Aux Aux1 by simp
+
      using C1 by simp  
  next
+
     then show "((P (f x)) ∨ (algunos P (map f xs))) =  
 +
              ((P (f x)) ∨ (algunos (P o f) xs))"  
 +
      using Aux Aux1 by simp
 +
  next
 
     assume C2: "¬(P (f x))"
 
     assume C2: "¬(P (f x))"
     have Aux2: "((P (f x)) ∨ (algunos P (map f xs))) = (algunos P (map f xs))" using C2 by simp
+
     have Aux2: "((P (f x)) ∨ (algunos P (map f xs))) =  
 +
                (algunos P (map f xs))" using C2 by simp
 
     have Aux3: "… = (algunos (P o f) xs)" using HI by (simp add: AUX)
 
     have Aux3: "… = (algunos (P o f) xs)" using HI by (simp add: AUX)
     also have "… =  ((P (f x)) ∨ (algunos (P o f) xs))" using C2 by simp
+
     also have "… =  ((P (f x)) ∨ (algunos (P o f) xs))"  
     then show "((P (f x)) ∨ (algunos P (map f xs))) = ((P (f x)) ∨ (algunos (P o f) xs))"  
+
      using C2 by simp
            using Aux2 Aux3 by simp
+
     then show "((P (f x)) ∨ (algunos P (map f xs))) =  
 +
              ((P (f x)) ∨ (algunos (P o f) xs))"  
 +
      using Aux2 Aux3 by simp
 
   qed
 
   qed
also have "… = (((P o f) x) ∨ (algunos (P o f) xs))" by simp
+
  also have "… = (((P o f) x) ∨ (algunos (P o f) xs))" by simp
also have "… = (algunos (P o f) (x#xs))" by simp
+
  also have "… = (algunos (P o f) (x#xs))" by simp
finally show "algunos P (map f (x#xs)) = (algunos (P o f) (x#xs))" by simp
+
  finally show "algunos P (map f (x#xs)) = (algunos (P o f) (x#xs))"  
 +
    by simp
 
qed
 
qed
 +
 +
(* Comentario: Se puede simplificar. *)
  
 
(* ferrenseg *)
 
(* ferrenseg *)
 
 
lemma "algunos P (map f xs) = algunos (P ∘ f) xs"
 
lemma "algunos P (map f xs) = algunos (P ∘ f) xs"
 
proof (induct xs)
 
proof (induct xs)
Línea 538: Línea 728:
 
   show "algunos P (map f (x # xs)) = algunos (P ∘ f) (x # xs)"
 
   show "algunos P (map f (x # xs)) = algunos (P ∘ f) (x # xs)"
 
   proof -
 
   proof -
     have "algunos P (map f (x # xs)) = algunos P ((f x) # (map f xs))" by simp
+
     have "algunos P (map f (x # xs)) = algunos P ((f x) # (map f xs))"  
 +
      by simp
 
     also have "… = ((P (f x)) ∨ (algunos P (map f xs)))" by simp
 
     also have "… = ((P (f x)) ∨ (algunos P (map f xs)))" by simp
     also have "… = (((P ∘ f) x) ∨ (algunos (P ∘ f) xs))" using HI by simp
+
     also have "… = (((P ∘ f) x) ∨ (algunos (P ∘ f) xs))"  
 +
      using HI by simp
 
     also have "… = algunos (P ∘ f) (x # xs)" by simp
 
     also have "… = algunos (P ∘ f) (x # xs)" by simp
     finally show ?thesis
+
     finally show ?thesis by simp
 
   qed
 
   qed
 
qed
 
qed
  
 
(* ivamenjim *)
 
(* ivamenjim *)
 
 
lemma "algunos P (map f xs) = algunos (P o f) xs"
 
lemma "algunos P (map f xs) = algunos (P o f) xs"
 
proof (induct xs)
 
proof (induct xs)
Línea 555: Línea 746:
 
   assume HI: "algunos P (map f xs) = algunos (P ∘ f) 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
 
   have "algunos P (map f (a # xs)) = algunos P ((f a)#map f xs)" by simp
   also have "... = (algunos P (map f [a]) ∨ algunos P (map f xs))" by simp  
+
   also have "... = (algunos P (map f [a]) ∨ algunos P (map f xs))"  
   also have "... = (algunos P (map f [a]) ∨ algunos (P ∘ f) xs)" using HI by simp  
+
    by simp  
   finally show "algunos P (map f (a # xs)) = algunos (P ∘ f) (a # xs)" by simp
+
   also have "... = (algunos P (map f [a]) ∨ algunos (P ∘ f) xs)"  
 +
    using HI by simp  
 +
   finally show "algunos P (map f (a # xs)) = algunos (P ∘ f) (a # xs)"  
 +
    by simp
 
qed
 
qed
  
(* crigomgom rubgonmar anaprarod marpoldia1 juacabsou *)
+
(* crigomgom rubgonmar anaprarod marpoldia1 juacabsou danrodcha
 +
  paupeddeg josgarsan lucnovdos pabrodmac *)  
 
lemma "algunos P (map f xs) = algunos (P o f) xs"
 
lemma "algunos P (map f xs) = algunos (P o f) xs"
 
proof (induct xs)
 
proof (induct xs)
Línea 567: Línea 762:
 
   fix x xs
 
   fix x xs
 
   assume HI: "algunos P (map f xs) = algunos (P ∘ f) xs"
 
   assume HI: "algunos P (map f xs) = algunos (P ∘ f) xs"
   have "algunos P (map f (x # xs))  = algunos P ((f x) # (map f xs))" by simp
+
   have "algunos P (map f (x # xs))  = algunos P ((f x) # (map f xs))"  
 +
    by simp
 
   also have "... = (P (f x) ∨ algunos P (map f xs))" by simp
 
   also have "... = (P (f x) ∨ algunos P (map f xs))" by simp
 
   also have "... = (P (f x) ∨ algunos (P ∘ f) xs)" using HI by simp
 
   also have "... = (P (f x) ∨ algunos (P ∘ f) xs)" using HI by simp
 
   also have "... = ((P ∘ f) x ∨ algunos (P ∘ f) xs)" by simp
 
   also have "... = ((P ∘ f) x ∨ algunos (P ∘ f) xs)" by simp
   finally show "algunos P (map f (x # xs)) = algunos (P ∘ f) (x # xs)" by simp
+
   finally show "algunos P (map f (x # xs)) = algunos (P ∘ f) (x # xs)"  
 +
    by simp
 
qed
 
qed
  
(* wilmorort *)
+
(* wilmorort pablucoto marcarmor13 jeamacpov *)
 
lemma "algunos P (map f xs) = algunos (P o f) xs" (is "?P xs" )
 
lemma "algunos P (map f xs) = algunos (P o f) xs" (is "?P xs" )
 
proof (induct xs)
 
proof (induct xs)
show "?P []" by simp
+
  show "?P []" by simp
 
next
 
next
fix a xs
+
  fix a xs
assume HI: "algunos P (map f xs) = algunos (P ∘ f) xs"
+
  assume HI: "algunos P (map f xs) = algunos (P ∘ f) xs"
have "algunos P (map f (a # xs))  = (P (f a) ∨ algunos P (map f xs))"  by simp
+
  have "algunos P (map f (a # xs))  = (P (f a) ∨ algunos P (map f xs))"   
also have "... = (P (f a) ∨ algunos (P ∘ f) xs )" using HI by simp
+
    by simp
also have "... = ((P ∘ f) a ∨ algunos (P ∘ f)xs)" by simp
+
  also have "... = (P (f a) ∨ algunos (P ∘ f) xs )" using HI by simp
finally show " algunos P (map f (a # xs)) = algunos (P ∘ f) (a # xs)" 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
 
qed
  
(* fraortmoy *)
+
(* fraortmoy serrodcal *)
 
 
 
lemma "algunos P (map f xs) = algunos (P o f) xs"
 
lemma "algunos P (map f xs) = algunos (P o f) xs"
 
proof (induct xs)
 
proof (induct xs)
Línea 595: Línea 793:
 
   fix a xs
 
   fix a xs
 
   assume H1: "algunos P (map f xs) = algunos (P ∘ f) xs"
 
   assume H1: "algunos P (map f xs) = algunos (P ∘ f) xs"
   have  "algunos P (map f (a # xs)) = (algunos P (map f [a]) ∨ algunos P (map f xs))" by simp
+
   have  "algunos P (map f (a # xs)) =  
   also have "… = (algunos (P ∘ f) [a] ∨  algunos (P ∘ f) xs )" using H1 by simp
+
        (algunos P (map f [a]) ∨ algunos P (map f xs))" by simp
 +
   also have "… = (algunos (P ∘ f) [a] ∨  algunos (P ∘ f) xs )"  
 +
    using H1 by simp
 
   also have "… = algunos (P ∘ f) (a#xs)" by simp
 
   also have "… = algunos (P ∘ f) (a#xs)" by simp
 +
  finally show "algunos P (map f (a # xs)) = algunos (P ∘ f) (a#xs)"
 +
    by simp
 +
qed
 +
 +
(* danrodcha fracorjim1 *)
 +
lemma "algunos P (map f xs) = algunos (P o f) xs" (is "?Q xs")
 +
proof (induct xs)
 +
  show "?Q []" by simp
 +
next
 +
  fix a xs assume HI: "?Q 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 blast
 +
  also have "… = ((P ∘ f) a ∨ algunos (P ∘ f) xs)"  by simp
 +
  also have "… = algunos (P ∘ f) (a # xs)" by simp
 +
  finally show "?Q (a # xs)" by blast
 +
qed
 +
 +
(* dancorgar *)
 +
lemma "algunos P (map f xs) = algunos (P o f) xs"
 +
proof (induct xs)
 +
  show "algunos P (map f []) = algunos (P o f) []" by simp
 +
next
 +
  fix x xs
 +
  assume HI: "algunos P (map f xs) = algunos (P o f) xs"
 +
  have "algunos P (map f (x#xs)) = ((P (f x)) ∨ (algunos P (map f xs)))"
 +
    by simp
 +
  also have "… = ((P (f x)) ∨ (algunos (P o f) xs))" using HI by simp
 +
  finally show "algunos P (map f (x#xs)) = algunos (P o f) (x#xs)"
 +
    by simp
 +
qed
 +
 +
(* antsancab1 *)
 +
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 "... = algunos (P ∘ f) (a#xs)" by simp
 
   finally show "algunos P (map f (a # xs)) = algunos (P ∘ f) (a#xs)" by simp
 
   finally show "algunos P (map f (a # xs)) = algunos (P ∘ f) (a#xs)" by simp
 
qed
 
qed
Línea 608: Línea 852:
 
*}
 
*}
  
(* ivamenjim marpoldia1 paupeddeg crigomgom rubgonmar  wilmorort*)
+
(* ivamenjim marpoldia1 paupeddeg crigomgom rubgonmar  wilmorort
 
+
  fraortmoy danrodcha pablucoto dancorgar josgarsan anaprarod juacabsou
 +
  lucnovdos marcarmor13 jeamacpov antsancab1 pabrodmac *)
 
lemma "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
 
lemma "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
 
by (induct xs) auto
 
by (induct xs) auto
Línea 616: Línea 861:
 
lemma "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
 
lemma "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
 
by (induct xs) simp_all
 
by (induct xs) simp_all
 +
 +
(* anaprarod fracorjim1 *)
 +
lemma "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
 +
apply (induct  xs)
 +
apply auto
 +
done
  
 
text {*
 
text {*
Línea 624: Línea 875:
 
*}
 
*}
  
(* ivamenjim ferrenseg marpoldia1 wilmorort*)
+
(* ivamenjim ferrenseg marpoldia1 wilmorort dancorgar josgarsan
 
+
  juacabsou serrodcal lucnovdos rubgonmar *)  
 
lemma algunos_append:
 
lemma algunos_append:
 
   "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
 
   "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
Línea 633: Línea 884:
 
   fix a xs
 
   fix a xs
 
   assume HI: "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
 
   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
+
   have "algunos P ((a # xs) @ ys) = (P a ∨ (algunos P (xs @ ys)))"  
   also have "... = (P a ∨ (algunos P xs ∨ algunos P ys))" using HI by simp
+
    by simp
   finally show "algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P 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
 
qed
  
 
(* migtermor crigomgom *)
 
(* migtermor crigomgom *)
 
+
lemma algunos_append2:
lemma algunos_append:
 
 
   "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)" (is "?Q xs")
 
   "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)" (is "?Q xs")
 
proof (induct xs)
 
proof (induct xs)
show "?Q []" by simp
+
  show "?Q []" by simp
 
next  
 
next  
fix x xs
+
  fix x xs
assume HI: "?Q xs"
+
  assume HI: "?Q xs"
have "algunos P ((x#xs) @ ys) = algunos P (x#(xs @ ys))" by simp
+
  have "algunos P ((x#xs) @ ys) = algunos P (x#(xs @ ys))" by simp
also have "… = ((P x) ∨ (algunos P (xs @ ys)))" by simp
+
  also have "… = ((P x) ∨ (algunos P (xs @ ys)))" by simp
also have "… = ((P x) ∨ (algunos P xs) ∨ (algunos P ys))" using HI by simp
+
  also have "… = ((P x) ∨ (algunos P xs) ∨ (algunos P ys))"  
also have "… = ((algunos P (x#xs)) ∨ (algunos P ys))" by simp
+
    using HI by simp
finally show "algunos P ((x#xs) @ ys) = (algunos P (x#xs) ∨ algunos P ys)" by simp
+
  also have "… = ((algunos P (x#xs)) ∨ (algunos P ys))" by simp
 +
  finally show "algunos P ((x#xs) @ ys) =  
 +
                (algunos P (x#xs) ∨ algunos P ys)" by simp
 
qed
 
qed
  
 
(* paupeddeg*)
 
(* paupeddeg*)
lemma algunos_append:
+
lemma algunos_append3:
 +
  "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) =
 +
        (algunos P [a] ∨ ( algunos P (xs @ ys)))" by simp
 +
  also have "... = (algunos 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
 +
 
 +
(* fraortmoy *)
 +
lemma algunos_append4:
 
   "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
 
   "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 H1: "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
 +
  have "algunos P ((a # xs) @ ys) =
 +
        (algunos P [a] ∨ algunos P (xs @ ys))" by simp
 +
  also have "… = (algunos P [a] ∨ algunos P xs ∨ algunos P ys)"
 +
    using H1 by simp
 +
  also have "… = ((algunos P [a] ∨ algunos P xs) ∨ algunos P ys)"
 +
    by simp
 +
  also have "… = (algunos P (a#xs) ∨ algunos P ys)" by simp
 +
  finally show "algunos P ((a # xs) @ ys) =
 +
                (algunos P (a#xs) ∨ algunos P ys)" by simp
 +
qed
 +
 +
(* danrodcha pablucoto anaprarod marcarmor13 jeamacpov pabrodmac *)
 +
lemma algunos_append5:
 +
  "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)" (is "?Q xs")
 +
proof (induct xs)
 +
  show "?Q []" by simp
 +
next
 +
  fix a xs assume HI: "?Q xs"
 +
  have "algunos P ((a#xs) @ ys) = algunos P (a#(xs @ ys))" by simp
 +
  also have "… = (algunos P [a] ∨ algunos P (xs @ ys))" by simp
 +
  also have "… = (algunos P [a] ∨ algunos P xs ∨ algunos P ys)"
 +
    using HI by simp
 +
  also have "… = (algunos P (a # xs) ∨ algunos P ys)" by simp
 +
  finally show "?Q (a # xs)" by simp
 +
qed
 +
 +
(* antsancab1 *)
 +
lemma algunos_append6: "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
 
proof (induct xs)
 
proof (induct xs)
 
   show "algunos P ([] @ ys) = (algunos P [] ∨ algunos P ys)" by simp
 
   show "algunos P ([] @ ys) = (algunos P [] ∨ algunos P ys)" by simp
Línea 662: Línea 966:
 
   fix a xs
 
   fix a xs
 
   assume HI: "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
 
   assume HI: "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
   have "algunos P ((a # xs) @ ys) = (algunos P [a] ( algunos P (xs @ ys)))" by simp
+
   have "algunos P ((a # xs) @ ys) = (P a ∨ algunos P (xs @ ys))" by simp
   also have "... = (algunos P [a] (algunos P xs ∨ algunos P ys))" using HI by simp
+
   also have "... = (P a ∨ algunos P xs ∨ algunos P ys)" using HI by simp
 +
  also have "... = (algunos P (a#xs) ∨ algunos P ys)" by simp
 
   finally show "algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)" by simp
 
   finally show "algunos P ((a # xs) @ ys) = (algunos P (a # xs) ∨ algunos P ys)" by simp
 
qed
 
qed
Línea 674: Línea 979:
 
*}
 
*}
  
(* ivamenjim migtermor marpoldia1 rubgonmar *)
+
(* ivamenjim migtermor marpoldia1 rubgonmar paupeddeg dancorgar
 
+
  anaprarod serrodcal antsancab1 fracorjim1 *)  
 
lemma "algunos P (rev xs) = algunos P xs"
 
lemma "algunos P (rev xs) = algunos P xs"
 
apply (induct xs)
 
apply (induct xs)
Línea 683: Línea 988:
 
done
 
done
  
(* ferrenseg crigomgom*)
+
(* ferrenseg crigomgom danrodcha pablucoto josgarsan pabrodmac lucnovdos
 +
  marcarmor13 jeamacpov *)  
 
lemma "algunos P (rev xs) = algunos P xs"
 
lemma "algunos P (rev xs) = algunos P xs"
 
by (induct xs) (auto simp add: algunos_append)
 
by (induct xs) (auto simp add: algunos_append)
  
(* wilmorort *)
+
(* wilmorort juacabsou *)
 
lemma "algunos P (rev xs) = algunos P xs"
 
lemma "algunos P (rev xs) = algunos P xs"
 
by (induct xs,simp,simp add: algunos_append,auto)  
 
by (induct xs,simp,simp add: algunos_append,auto)  
Línea 697: Línea 1003:
 
   ---------------------------------------------------------------------  
 
   ---------------------------------------------------------------------  
 
*}
 
*}
 
lemma "algunos P (rev xs) = algunos P xs"
 
oops
 
  
 
(* migtermor *)
 
(* migtermor *)
Línea 708: Línea 1011:
 
lemma "algunos P (rev xs) = algunos P xs" (is "?Q xs")
 
lemma "algunos P (rev xs) = algunos P xs" (is "?Q xs")
 
proof (induct xs)
 
proof (induct xs)
show "?Q []" by simp
+
  show "?Q []" by simp
 
next
 
next
fix x xs
+
  fix x xs
assume HI: "?Q xs"
+
  assume HI: "?Q xs"
have "algunos P (rev (x#xs)) = (algunos P (rev xs @ [x]))" using auxiliar1 by simp
+
  have "algunos P (rev (x#xs)) = (algunos P (rev xs @ [x]))"  
also have "… = ((algunos P (rev xs)) ∨ (algunos P [x]))" by (simp add: algunos_append)
+
    using auxiliar1 by simp
also have "… = ((P x) ∨ (algunos P (rev xs)))" by simp arith
+
  also have "… = ((algunos P (rev xs)) ∨ (algunos P [x]))"  
also have "… = ((P x) ∨ (algunos P xs))" using HI by simp
+
    by (simp add: algunos_append)
finally show "algunos P (rev (x#xs)) = (algunos P (x#xs))" by simp
+
  also have "… = ((P x) ∨ (algunos P (rev xs)))" by simp arith
 +
  also have "… = ((P x) ∨ (algunos P xs))" using HI by simp
 +
  finally show "algunos P (rev (x#xs)) = (algunos P (x#xs))" by simp
 
qed
 
qed
  
 
(* ferrenseg *)
 
(* ferrenseg *)
 
 
lemma "algunos P (rev xs) = algunos P xs"
 
lemma "algunos P (rev xs) = algunos P xs"
 
proof (induct xs)
 
proof (induct xs)
show "algunos P (rev []) = algunos P []" by simp
+
  show "algunos P (rev []) = algunos P []" by simp
 
next
 
next
 
   fix x xs
 
   fix x xs
Línea 736: Línea 1040:
 
     also have "… = (P x ∨ algunos P xs)" by auto
 
     also have "… = (P x ∨ algunos P xs)" by auto
 
     also have "… = algunos P (x # xs)" by simp
 
     also have "… = algunos P (x # xs)" by simp
     finally show ?thesis
+
     finally show ?thesis by simp
 
   qed
 
   qed
 
qed
 
qed
 
   
 
   
 
(* ivamenjim marpoldia1*)
 
(* ivamenjim marpoldia1*)
 
 
lemma "algunos P (rev xs) = algunos P xs" (is "?P xs")
 
lemma "algunos P (rev xs) = algunos P xs" (is "?P xs")
 
proof (induct xs)
 
proof (induct xs)
Línea 749: Línea 1052:
 
   assume HI: "?P xs"
 
   assume HI: "?P xs"
 
   have "algunos P (rev (a # xs)) = (algunos P ((rev xs)@[a]))" by simp
 
   have "algunos P (rev (a # xs)) = (algunos P ((rev xs)@[a]))" by simp
   also have "... = ((algunos P (rev xs)) ∨ algunos P [a])" by (simp add: algunos_append)
+
   also have "... = ((algunos P (rev xs)) ∨ algunos P [a])"  
 +
    by (simp add: algunos_append)
 
   also have "... = (algunos P xs ∨ algunos P [a])" using HI by simp
 
   also have "... = (algunos P xs ∨ algunos P [a])" using HI by simp
 
   also have "... = (algunos P [a] ∨ algunos P xs)" by arith
 
   also have "... = (algunos P [a] ∨ algunos P xs)" by arith
Línea 755: Línea 1059:
 
qed
 
qed
  
(*paupeddeg*)
+
(* paupeddeg dancorgar serrodcal lucnovdos*)
 
lemma "algunos P (rev xs) = algunos P xs"
 
lemma "algunos P (rev xs) = algunos P xs"
 
proof (induct xs)
 
proof (induct xs)
Línea 763: Línea 1067:
 
   assume HI:"algunos P (rev xs) = algunos P xs"
 
   assume HI:"algunos P (rev xs) = algunos P xs"
 
   have "algunos P (rev (a # xs)) = algunos P ((rev xs) @ [a])" by simp
 
   have "algunos P (rev (a # xs)) = algunos P ((rev xs) @ [a])" by simp
   also have "... = ((algunos P (rev xs)) ∨ (algunos P [a]))" by (simp add: algunos_append)
+
   also have "... = ((algunos P (rev xs)) ∨ (algunos P [a]))"  
 +
    by (simp add: algunos_append)
 
   also have "... = ((algunos P xs) ∨ (algunos P [a]))" using HI by simp
 
   also have "... = ((algunos P xs) ∨ (algunos P [a]))" using HI by simp
 
   also have "... = ((algunos P [a]) ∨ (algunos P xs))" by arith
 
   also have "... = ((algunos P [a]) ∨ (algunos P xs))" by arith
Línea 769: Línea 1074:
 
qed
 
qed
  
(*crigomgom *)
+
(* crigomgom pablucoto anaprarod rubgonmar juacabsou marcarmor13 jeamacpov pabrodmac *)
 
lemma "algunos P (rev xs) = algunos P xs"
 
lemma "algunos P (rev xs) = algunos P xs"
 
proof (induct xs)
 
proof (induct xs)
Línea 777: Línea 1082:
 
   assume HI: " algunos P (rev xs) = algunos P xs"  
 
   assume HI: " algunos P (rev xs) = algunos P xs"  
 
   have "algunos P (rev (x # xs)) = algunos P ((rev xs) @ [x])" by simp
 
   have "algunos P (rev (x # xs)) = algunos P ((rev xs) @ [x])" by simp
   also have "... = (algunos P (rev xs) ∨ algunos P [x])"  by (simp add: algunos_append)
+
   also have "... = (algunos P (rev xs) ∨ algunos P [x])"   
 +
    by (simp add: algunos_append)
 
   also have "... = (algunos P xs  ∨ algunos P [x])" using HI by simp
 
   also have "... = (algunos P xs  ∨ algunos P [x])" using HI by simp
 
   also have "... = (algunos P xs ∨ P x)" by simp
 
   also have "... = (algunos P xs ∨ P x)" by simp
Línea 784: Línea 1090:
 
   finally show "algunos P (rev (x # xs)) = algunos P (x # xs)" by simp
 
   finally show "algunos P (rev (x # xs)) = algunos P (x # xs)" by simp
 
qed
 
qed
 
  
 
(*wilmorort*)
 
(*wilmorort*)
 
lemma "algunos P (rev xs) = algunos P xs"  (is "?P xs")
 
lemma "algunos P (rev xs) = algunos P xs"  (is "?P xs")
 
proof (induct xs)  
 
proof (induct xs)  
show "?P []" by simp  
+
  show "?P []" by simp  
 
next
 
next
fix a xs
+
  fix a xs
assume HI: "?P xs"
+
  assume HI: "?P xs"
have "algunos P (rev (a#xs)) = algunos P ((rev xs) @ [a])" by simp
+
  have "algunos P (rev (a#xs)) = algunos P ((rev xs) @ [a])" by simp
also have "... = (algunos P(rev xs) ∨ algunos P [a])" by (simp add: algunos_append)
+
  also have "... = (algunos P(rev xs) ∨ algunos P [a])"  
also have "... = (algunos P xs ∨ algunos P [a])" using HI by simp
+
    by (simp add: algunos_append)
also have "... = (algunos P [a] ∨ algunos P xs)" by (simp add: HOL.disj_commute)
+
  also have "... = (algunos P xs ∨ algunos P [a])" using HI by simp
also have "... = algunos P([a]@(xs))" by (simp)
+
  also have "... = (algunos P [a] ∨ algunos P xs)"  
finally show  "algunos  P (rev (a#xs))= algunos P (a # xs)" by simp
+
    by (simp add: HOL.disj_commute)
 +
  also have "... = algunos P([a]@(xs))" by (simp)
 +
  finally show  "algunos  P (rev (a#xs))= algunos P (a # xs)" by simp
 +
qed
 +
 
 +
(* danrodcha *)
 +
lemma "algunos P (rev xs) = algunos P xs" (is "?Q xs")
 +
proof (induct xs)
 +
  show "?Q []" by simp
 +
next
 +
  fix a xs assume HI: "?Q xs"
 +
  have "algunos P (rev (a#xs)) = algunos P ((rev xs) @ [a])" by simp
 +
  also have "… = (algunos P (rev xs) ∨ algunos P [a])"
 +
    by (simp add:algunos_append)
 +
  also have "… = (algunos P xs ∨ algunos P [a])" using HI by simp
 +
  also have "… = (algunos P [a] ∨ algunos P xs)"
 +
    by (simp add: HOL.disj_commute)
 +
  also have "… = algunos P (a # xs)" by simp
 +
  finally show "?Q (a # xs)" by simp
 +
qed
 +
 
 +
(* antsancab1 *)
 +
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 "... = (algunos P (rev xs) ∨ algunos P [a])" by (simp add:algunos_append)
 +
  also have "... = (algunos P xs ∨ algunos P [a])" using HI by simp
 +
  also have "... = (algunos P [a] ∨ algunos P xs)" by auto
 +
  also have "... = algunos P (a#xs)" by simp
 +
  finally show "algunos P (rev (a # xs)) = algunos P (a # xs)" by simp
 
qed
 
qed
  
Línea 811: Línea 1149:
  
 
(* migtermor *)
 
(* migtermor *)
 
+
lemma "algunos (λx. P x ∨ Q x) xs =  
lemma "algunos (λx. P x ∨ Q x) xs = ((algunos (λx. P x) xs) ∨ (algunos (λx. Q x) xs))"
+
      ((algunos (λx. P x) xs) ∨ (algunos (λx. Q x) xs))"
 
by (induct xs) auto
 
by (induct xs) auto
  
lemma "algunos (λx. P x ∨ Q x) xs = ((algunos (λx. P x) xs) ∨ (algunos (λx. Q x) xs))" (is "?R xs")
+
lemma "algunos (λx. P x ∨ Q x) xs =  
 +
      ((algunos (λx. P x) xs) ∨ (algunos (λx. Q x) xs))" (is "?R xs")
 
proof (induct xs)
 
proof (induct xs)
show "?R []" by simp
+
  show "?R []" by simp
 
next
 
next
fix x xs
+
  fix x xs
assume HI: "?R xs"
+
  assume HI: "?R xs"
have "algunos (λx. P x ∨ Q x) (x#xs) = (((λx. P x ∨ Q x) x) ∨ (algunos (λx. P x ∨ Q x) xs))"
+
  have "algunos (λx. P x ∨ Q x) (x#xs) =  
      by simp
+
        (((λx. P x ∨ Q x) x) ∨ (algunos (λx. P x ∨ Q x) xs))" by simp
also have "… = ((P x ∨ Q x) ∨ (algunos (λx. P x ∨ Q x) xs))" by simp
+
  also have "… = ((P x ∨ Q x) ∨ (algunos (λx. P x ∨ Q x) xs))" by simp
also have H1: "… = ((((λx. P x) x) ∨ (algunos (λx. P x) xs)) ∨ (((λx. Q x) x) ∨ (algunos (λx. Q x) xs)))"
+
  also have H1: "… = ((((λx. P x) x) ∨ (algunos (λx. P x) xs)) ∨  
          using HI by simp arith
+
                      (((λx. Q x) x) ∨ (algunos (λx. Q x) xs)))"
have H2: "… = ((algunos (λx. P x) (x#xs)) ∨ (algunos (λx. Q x) (x#xs)))"  
+
    using HI by simp arith
              by simp
+
  have H2: "… = ((algunos (λx. P x) (x#xs)) ∨ (algunos (λx. Q x) (x#xs)))"  
have C: "(algunos (λx. P x ∨ Q x) (x#xs)) =  
+
    by simp
              ((algunos (λx. P x) (x#xs)) ∨ (algunos (λx. Q x) (x#xs)))"  
+
  have C: "(algunos (λx. P x ∨ Q x) (x#xs)) =  
        using H1 H2 by simp
+
          ((algunos (λx. P x) (x#xs)) ∨ (algunos (λx. Q x) (x#xs)))"  
finally show "(algunos (λx. P x ∨ Q x) (x#xs)) =  
+
    using H1 H2 by simp
              ((algunos (λx. P x) (x#xs)) ∨ (algunos (λx. Q x) (x#xs)))"  
+
  finally show "(algunos (λx. P x ∨ Q x) (x#xs)) =  
              using C by simp
+
                ((algunos (λx. P x) (x#xs)) ∨ (algunos (λx. Q x) (x#xs)))"  
 +
    using C by simp
 
qed
 
qed
  
 +
(* CComentario: Ruptura de la cadena de igualdades. *)
  
 
(* ferrenseg *)
 
(* ferrenseg *)
 
 
lemma "algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)"
 
lemma "algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)"
 
proof (induct xs)
 
proof (induct xs)
   show "algunos  (λx. P x ∨ Q x) [] = (algunos P [] ∨ algunos Q [])" by simp
+
   show "algunos  (λx. P x ∨ Q x) [] = (algunos P [] ∨ algunos Q [])"  
 +
    by simp
 
next
 
next
 
   fix x xs
 
   fix x xs
 
   assume HI: "algunos (λx. (P x ∨ Q x)) xs = (algunos P xs ∨ algunos Q xs)"
 
   assume HI: "algunos (λx. (P x ∨ Q x)) xs = (algunos P xs ∨ algunos Q xs)"
   show "algunos (λx. P x ∨ Q x) (x # xs) = (algunos P (x # xs) ∨ algunos Q (x # xs))"
+
   show "algunos (λx. P x ∨ Q x) (x # xs) =  
 +
        (algunos P (x # xs) ∨ algunos Q (x # xs))"
 
   proof -
 
   proof -
 
     have "algunos (λx. P x ∨ Q x) (x # xs) =  
 
     have "algunos (λx. P x ∨ Q x) (x # xs) =  
      ((P x) ∨ (Q x) ∨ algunos (λx. P x ∨ Q x) xs)" by simp
+
          ((P x) ∨ (Q x) ∨ algunos (λx. P x ∨ Q x) xs)" by simp
 
     also have "… = ((P x) ∨ (Q x) ∨ algunos P xs ∨ algunos Q xs)"  
 
     also have "… = ((P x) ∨ (Q x) ∨ algunos P xs ∨ algunos Q xs)"  
 
       using HI by simp
 
       using HI by simp
     also have "… = (((P x) ∨ algunos P xs) ∨ ((Q x) ∨ algunos Q xs))" by auto
+
     also have "… = (((P x) ∨ algunos P xs) ∨ ((Q x) ∨ algunos Q xs))"  
 +
      by auto
 
     also have "… = (algunos P (x # xs) ∨ algunos Q (x # xs))" by simp
 
     also have "… = (algunos P (x # xs) ∨ algunos Q (x # xs))" by simp
     finally show ?thesis  
+
     finally show ?thesis by simp
 
   qed
 
   qed
 
qed
 
qed
  
(* ivamenjim marpoldia1 *)
+
(* Comentario: Uso de auto *)
  
 +
(* ivamenjim marpoldia1 paupeddeg *)
 
lemma "algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)"  
 
lemma "algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)"  
 
by (induct xs) auto
 
by (induct xs) auto
Línea 864: Línea 1208:
 
lemma "algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)"
 
lemma "algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)"
 
proof (induct xs)
 
proof (induct xs)
   show "algunos (λx. P x ∨ Q x) [] = (algunos P [] ∨ algunos Q [])" by simp
+
   show "algunos (λx. P x ∨ Q x) [] = (algunos P [] ∨ algunos Q [])"  
 +
    by simp
 
next  
 
next  
 
   fix a xs
 
   fix a xs
 
   assume HI: "algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q 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
+
   have "algunos (λx. P x ∨ Q x) (a # xs) =  
   also have "... = (P a ∨ Q a ∨ algunos P xs ∨ algunos Q xs)" using HI by simp
+
        (P a ∨ Q a ∨ algunos (λx. P x ∨ Q x) xs)" by simp
   finally show "algunos (λx. P x ∨ Q x) (a # xs) = (algunos P (a # xs) ∨ algunos Q (a # xs))" by auto
+
   also have "... = (P a ∨ Q a ∨ algunos P xs ∨ algunos Q xs)"  
 +
    using HI by simp
 +
   finally show "algunos (λx. P x ∨ Q x) (a # xs) =  
 +
                (algunos P (a # xs) ∨ algunos Q (a # xs))" by auto
 
qed
 
qed
  
 +
(* Comentario: Uso de auto *)
 +
 +
(* wilmorort danrodcha anaprarod juacabsou rubgonmar*)
 +
lemma "algunos (λx. P x ∨ Q x) xs =
 +
      (¬todos(λx. ¬P x)xs ∨ ¬todos(λx. ¬Q x)xs)"
 +
by (induct xs) auto
  
 
(* wilmorort *)
 
(* wilmorort *)
lemma "algunos (λx. P x ∨ Q x) xs = (¬todos(λx. ¬P x)xs ∨ ¬todos(λx. ¬Q x)xs)"
+
lemma "algunos (λx. P x ∨ Q x) xs =  
 +
      (¬todos(λx. ¬P x)xs ∨ ¬todos(λx. ¬Q x)xs)"
 +
      (is "?P xs")
 +
proof (induct xs)
 +
  show "?P []" by simp
 +
next
 +
  fix a xs
 +
  assume HI: "?P 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 ∨ 
 +
                    (¬ todos (λx. ¬ P x) xs ∨ ¬ todos (λx. ¬ Q x) xs))"
 +
    using HI by simp
 +
  also have "... = (P a ∨ ¬ todos (λx. ¬ P x) xs ∨
 +
                    Q a ∨  ¬ todos (λx. ¬ Q x) xs )" by arith
 +
  finally show  "algunos (λx. P x ∨ Q x) (a # xs) =
 +
                (~ todos (λx. ¬ P x) (a # xs) ∨
 +
                  ~ todos (λx. ¬ Q x) (a # xs))" by simp
 +
qed
 +
 
 +
(* danrodcha *)
 +
lemma "algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)"
 +
      (is "?R xs")
 +
proof (induct xs)
 +
  show "?R []" by simp
 +
next
 +
  fix a xs assume HI: "?R xs"
 +
    have 1:" (Q a ∨ algunos P xs) = (algunos P xs ∨ Q a)"
 +
      by (simp add: HOL.disj_commute)
 +
    have "algunos (λx. P x ∨ Q x) (a # xs) =
 +
          (algunos P [a] ∨ algunos 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)"
 +
      using 1 by simp
 +
    also have "… = (algunos P (a # xs) ∨ algunos Q (a # xs))" by simp
 +
    finally show "?R (a # xs)" by simp
 +
qed
 +
 
 +
(* dancorgar *)
 +
lemma "algunos (λx. P x ∧ Q x) xs ⟹ (algunos P xs ∧ algunos Q xs)"
 +
apply (induct xs)
 +
apply auto
 +
done
 +
 
 +
(* dancorgar *)
 +
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 xf xs
 +
  assume HI: "algunos (λx. P x ∧ Q x) xs ⟹ (algunos P xs ∧ algunos Q xs)"
 +
  have F1: "algunos (λx. P x ∧ Q x) (xf#xs) ⟹
 +
            ((P xf ∧ Q xf) ∨ algunos (λx. P x ∧ Q x) xs)" by simp
 +
  also have F2: "… ⟹ (P xf ∧ Q xf ∨ (algunos P xs ∧ algunos Q xs))"
 +
    using HI by simp
 +
  have F3: "((P xf ∧ Q xf) ∨ (algunos P xs ∧ algunos Q xs)) ⟹
 +
            ((P xf ∨ algunos P xs) ∧ (Q xf ∨ algunos Q xs))" by blast
 +
  have F4: "((P xf ∨ algunos P xs) ∧ (Q xf ∨ algunos Q xs)) ⟹
 +
    (algunos P (xf#xs) ∧ algunos Q (xf#xs))" by simp
 +
  show "algunos (λx. P x ∧ Q x) (xf#xs) ⟹
 +
        (algunos P (xf#xs) ∧ algunos Q (xf#xs))"
 +
    using F1 F2 F3 F4 by blast
 +
qed
 +
 
 +
(* pablucoto crigomgom serrodcal marcarmor13 jeamacpov pabrodmac *)
 +
-- "Automatica"
 +
lemma "algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)"
 
by (induct xs) auto
 
by (induct xs) auto
  
 +
-- "Detallada"
 +
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 arith
 +
  also have "… = (algunos P (a#xs) ∨ algunos Q (a#xs))" by simp
 +
  finally show "algunos (λx. P x ∨ Q x) (a # xs) =
 +
                (algunos P (a # xs) ∨ algunos Q (a # xs)) " by simp
 +
qed
  
lemma "algunos (λx. P x ∨ Q x) xs = (¬todos(λx. ¬P x)xs ∨ ¬todos(λx. ¬Q x)xs)"
+
(* anaprarod juacabsou rubgonmar *)
(is "?P xs")
+
lemma "algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)"  
 +
      (is "?P xs")
 
proof (induct xs)
 
proof (induct xs)
show "?P []" by simp
+
  show "?P []" by simp
 
next
 
next
fix a xs
+
  fix x xs
assume HI: "?P xs"
+
  assume HI: "?P xs"
have "algunos (λx. P x ∨ Q x) (a # xs) = (P a ∨ Q a ∨ algunos (λx. P x ∨ Q x) xs)" by simp
+
  have "algunos (λx. P x ∨ Q x) (x#xs) =
also have "... = (P a ∨ Q a (¬ todos (λx. ¬ P x) xs ∨ ¬ todos (λx. ¬ Q x) xs))" using HI by simp
+
        (P x ∨ Q x ∨ algunos (λx. P x ∨ Q x) xs)" by simp
also have "... = (P a ¬ todos (λx. ¬ P x) xs ∨ Q a ¬ todos (λx. ¬ Q x) xs )" by arith
+
  also have "= (P x ∨ Q x algunos P xs ∨ algunos Q xs)"  
finally show "algunos (λx. P x ∨ Q x) (a # xs) = (~ todos (λx. ¬ P x) (a # xs) ∨ ~ todos (λx. ¬ Q x) (a # xs))" by simp
+
    using HI by simp
 +
  also have "= (P x algunos P xs ∨ Q x algunos Q xs)" by arith
 +
  finally show "?P (x#xs)" by simp
 
qed
 
qed
  
 +
(* antsancab1 *)
 +
lemma "algunos(λx. P x ∨ Q x) xs = algunos(λx. P x) xs ∨ algunos(λx. Q x) xs"
 +
by (induct xs) auto
  
 +
lemma "algunos(λx. P x ∨ Q x) xs = (algunos(λx. P x) xs ∨ algunos(λx. Q x) 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 "... = (algunos P (a # xs) ∨ algunos Q (a # 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 {*
 
text {*
Línea 901: Línea 1359:
 
*}
 
*}
  
(* ivamenjim wilmorort migtermor marpoldia1 crigomgom rubgonmar *)
+
(* ivamenjim wilmorort migtermor marpoldia1 crigomgom rubgonmar
 
+
  paupeddeg danrodcha pablucoto dancorgar josgarsan anaprarod juacabsou
 +
  lucnovdos serrodcal marcarmor13 jeamacpov antsancab1 pabrodmac *)
 
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
 
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
 
by (induct xs) auto
 
by (induct xs) auto
  
 
(* ferrenseg *)
 
(* ferrenseg *)
 
 
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
 
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
 
by (induct xs) simp_all
 
by (induct xs) simp_all
 +
 +
(* anaprarod *)
 +
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
 +
apply (induct xs)
 +
apply auto
 +
done
 +
 
      
 
      
 
text {*
 
text {*
Línea 918: Línea 1383:
 
*}
 
*}
  
(* ivamenjim migtermor marpoldia1 crigomgom*)
+
(* ivamenjim migtermor marpoldia1 crigomgom paupeddeg josgarsan
 
+
  juacabsou serrodcal wilmorort *)  
 
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
 
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
 
proof (induct xs)
 
proof (induct xs)
Línea 928: Línea 1393:
 
   have "algunos P (a # xs) = (P a ∨ (algunos P xs))" by simp
 
   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))" using HI by simp
   finally show "algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))" by simp
+
   finally show "algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))"  
 +
    by simp
 
qed
 
qed
  
 
(* ferrenseg *)
 
(* ferrenseg *)
 
 
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
 
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
 
proof (induct xs)
 
proof (induct xs)
Línea 945: Línea 1410:
 
     also have "… = (¬ (¬ (P x) ∧ todos (λx. (¬ P x)) xs))" by simp
 
     also have "… = (¬ (¬ (P x) ∧ todos (λx. (¬ P x)) xs))" by simp
 
     also have "… = (¬ todos (λx. (¬ P x)) (x # xs))" by simp
 
     also have "… = (¬ todos (λx. (¬ P x)) (x # xs))" by simp
     finally show ?thesis
+
     finally show ?thesis by simp
 
   qed
 
   qed
 
qed
 
qed
   
+
 
 +
(* danrodcha pablucoto anaprarod rubgonmar marcarmor13 jeamacpov pabrodmac *)
 +
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)" (is "?Q xs")
 +
proof (induct xs)
 +
  show "?Q []" by simp
 +
next
 +
  fix a xs assume HI: "?Q 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 "… = (¬ todos(λx. (¬ P x)) (a # xs))" by simp
 +
  finally show "?Q (a # xs)" by simp
 +
qed
 +
 
 +
(* dancorgar*)
 +
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
 +
proof (induct xs)
 +
  show "algunos P [] = (¬ todos (λx. (¬ P x)) [])" by simp
 +
next
 +
  fix xf xs
 +
  assume HI: "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
 +
  have "algunos P (xf#xs) = ((P xf) ∨ algunos P xs)" by simp
 +
  also have "… = ( (P xf) ∨ (¬ todos (λx. (¬ P x)) xs) )"
 +
    using HI by simp
 +
  also have "… = (¬((¬P xf) ∧ (todos (λx. (¬ P x)) xs)))" by simp
 +
  finally show "algunos P (xf#xs) = (¬todos (λx. (¬ P x)) (xf#xs))"
 +
    by simp
 +
qed
 +
 
 +
(* lucnovdos*)
 +
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
 +
proof (induct xs)
 +
  show "algunos P [] = (¬ todos (λx. (¬ P x)) [])" by simp
 +
next
 +
  fix n xs
 +
  assume HI: "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
 +
  have "algunos P (n#xs) = ((P n) ∨ (algunos P xs))" by simp
 +
  also have "… = ((P n) ∨ (¬ todos (λx. (¬ P x)) xs))" using HI by simp
 +
  also have "… = (¬((¬P n) ∧  todos (λx. (¬ P x)) xs))" by simp
 +
  also have "… = (¬ todos (λx. (¬ P x)) (n#xs))" by simp
 +
  finally show "algunos P (n#xs) = (¬ todos (λx. (¬ P x)) (n#xs))"
 +
    by simp
 +
qed
 +
 
 +
(* antsancab1 *)
 +
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) (a#xs)))" by auto
 +
  finally show "algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))" by simp
 +
qed
 +
 
 
text {*
 
text {*
 
   ---------------------------------------------------------------------  
 
   ---------------------------------------------------------------------  
Línea 960: Línea 1481:
 
*}
 
*}
  
(* ivamenjim ferrenseg migtermor serrodcal crigomgom rubgonmar marpoldia1*)
+
(* ivamenjim ferrenseg migtermor serrodcal crigomgom rubgonmar
 
+
  marpoldia1 paupeddeg danrodcha dancorgar pablucoto anaprarod
 +
  juacabsou lucnovdos marcarmor13 wilmorort jeamacpov fracorjim1 pabrodmac *)
 
fun estaEn :: "'a ⇒ 'a list ⇒ bool" where
 
fun estaEn :: "'a ⇒ 'a list ⇒ bool" where
   "estaEn x [] = False"
+
   "estaEn x []     = False"
 
| "estaEn x (a#xs) = ((a = x) ∨ (estaEn x xs))"
 
| "estaEn x (a#xs) = ((a = x) ∨ (estaEn x xs))"
  
Línea 969: Línea 1491:
 
value "estaEn (1::nat) [3,2,4] = False"
 
value "estaEn (1::nat) [3,2,4] = False"
  
 +
(* antsancab1 *)
 +
fun estaEn1 :: "'a ⇒ 'a list ⇒ bool" where
 +
  "estaEn1 x [] = False"
 +
| "estaEn1 x (a#xs) = (if x = a then True else estaEn1 x xs )"  (* Se detiene al encontrar la primera coincidencia *)
 +
 +
value "estaEn1 (2::nat) [3,2,4] = True"
 +
value "estaEn1 (1::nat) [3,2,4] = False"
  
 
text {*
 
text {*
Línea 977: Línea 1506:
 
*}
 
*}
  
(* migtermor crigomgom*)
+
(* migtermor crigomgom *)
 
 
 
lemma "estaEn x xs = (algunos (λa. a=x) xs)"
 
lemma "estaEn x xs = (algunos (λa. a=x) xs)"
 
by (induct xs) auto
 
by (induct xs) auto
Línea 988: Línea 1516:
 
lemma "estaEn x xs = (algunos (λa. a=x) xs)" (is "?P xs")
 
lemma "estaEn x xs = (algunos (λa. a=x) xs)" (is "?P xs")
 
proof (induct xs)
 
proof (induct xs)
show "?P []" by simp
+
  show "?P []" by simp
 
next
 
next
fix a xs
+
  fix a xs
assume HI: "?P xs"
+
  assume HI: "?P xs"
have "estaEn x (a#xs) = ((a=x) ∨ (estaEn x xs))" by simp
+
  have "estaEn x (a#xs) = ((a=x) ∨ (estaEn x xs))" by simp
also have H: "… = ((a=x) ∨ (algunos (λa. a=x) xs))" using HI by simp
+
  also have H: "… = ((a=x) ∨ (algunos (λa. a=x) xs))" using HI by simp
also have "… = (((λa. a=x) a) ∨ (algunos (λa. a=x) xs))" using auxiliar13  by simp
+
  also have "… = (((λa. a=x) a) ∨ (algunos (λa. a=x) xs))"  
also have "… = (algunos (λa. a=x) (a#xs))" by simp
+
    using auxiliar13  by simp
have C: "estaEn x (a#xs) = (algunos (λa. a=x) (a#xs))" using H by simp
+
  also have "… = (algunos (λa. a=x) (a#xs))" by simp
finally show "estaEn x (a#xs) = (algunos (λa. a=x) (a#xs))" using C by simp
+
  have C: "estaEn x (a#xs) = (algunos (λa. a=x) (a#xs))" using H by simp  
 +
  finally show "estaEn x (a#xs) = (algunos (λa. a=x) (a#xs))"  
 +
    using C by simp
 
qed
 
qed
  
 +
(* Comentario: Ruptura de la cadena de igualdades. Se puede simplificar. *)
  
 
(* ferrenseg *)
 
(* ferrenseg *)
 
 
lemma estaEn_algunos:
 
lemma estaEn_algunos:
 
   "estaEn y xs = algunos (λx. x=y) xs"
 
   "estaEn y xs = algunos (λx. x=y) xs"
Línea 1020: Línea 1550:
 
     also have "… = (x=y ∨ algunos (λx. x=y) xs)" by auto
 
     also have "… = (x=y ∨ algunos (λx. x=y) xs)" by auto
 
     also have "… = algunos (λx. x=y) (x # xs)" by simp
 
     also have "… = algunos (λx. x=y) (x # xs)" by simp
     finally show ?thesis
+
     finally show ?thesis by simp
 
   qed
 
   qed
 
qed
 
qed
  
(*crigomgom*)
+
(* Comentario: Uso de auto *)
 +
 
 +
(* crigomgom paupeddeg dancorgar juacabsou serrodcal lucnovdos wilmorort *)
 +
lemma "estaEn a xs = algunos (λx. x = a) xs"
 +
by (induct xs) auto
 +
 
 
lemma "estaEn x xs = (algunos (λa. a=x) xs)"  
 
lemma "estaEn x xs = (algunos (λa. a=x) xs)"  
 
proof (induct xs)
 
proof (induct xs)
Línea 1033: Línea 1568:
 
   have "estaEn x (a # xs) = (a = x ∨ estaEn x xs)" by simp
 
   have "estaEn x (a # xs) = (a = x ∨ estaEn x xs)" by simp
 
   also have "... = (a = x ∨ algunos (λa. a = x) xs)" using HI by simp
 
   also have "... = (a = x ∨ algunos (λa. a = x) xs)" using HI by simp
   finally show " estaEn x (a # xs) = algunos (λa. a = x) (a # xs)" by simp
+
   finally show " estaEn x (a # xs) = algunos (λa. a = x) (a # xs)"  
 +
    by simp
 
qed
 
qed
  
 
(* ivamenjim marpoldia1 *)
 
(* ivamenjim marpoldia1 *)
 
 
lemma "estaEn x xs = algunos (λy. x=y) xs"
 
lemma "estaEn x xs = algunos (λy. x=y) xs"
 
by (induct xs) auto
 
by (induct xs) auto
Línea 1050: Línea 1585:
 
   also have "... =  (a = x ∨ algunos (op = x) xs)" using HI by simp
 
   also have "... =  (a = x ∨ algunos (op = x) xs)" using HI by simp
 
   finally show " estaEn x (a # xs) = algunos (op = x) (a # xs)" by auto
 
   finally show " estaEn x (a # xs) = algunos (op = x) (a # xs)" by auto
 +
qed
 +
 +
(* Comentarios:
 +
  + Uso de (op = x)
 +
  + Uso de auto
 +
*)
 +
 +
(* danrodcha *)
 +
lemma "estaEn a xs = algunos (op = a) xs"
 +
by (induct xs) auto
 +
 +
(* danrodcha *)
 +
lemma "estaEn a xs = algunos (op = a) xs"
 +
proof (induct xs)
 +
  show "estaEn a [] = algunos (op = a) []" by simp
 +
next
 +
  fix x xs
 +
  assume HI: "estaEn a xs = algunos (op = a) xs"
 +
  have "estaEn a (x # xs) = ((x = a) ∨ (estaEn a xs))" by simp
 +
  also have "… = (x = a ∨ algunos (op = a) xs)" using HI by simp
 +
  also have "… = ((op = a) x ∨ algunos (op = a) xs)"
 +
    by (simp add:HOL.eq_commute)
 +
  also have "… = algunos (op = a) (x # xs)" by simp
 +
  finally show "estaEn a (x # xs) = algunos (op = a) (x # xs)" by simp
 +
qed
 +
 +
(* pablucoto marcarmor13 jeamacpov pabrodmac *)
 +
-- "Automatica"
 +
lemma " estaEn y xs = algunos (λx. x=y) xs"
 +
by (induct xs) auto
 +
 +
-- "Detallada"
 +
lemma " estaEn y xs = algunos (λx. x=y) xs"
 +
proof (induct xs)
 +
  show "estaEn y [] = algunos (λx. x = y) []"  by simp
 +
next
 +
  fix a xs
 +
  assume HI: " estaEn y xs = algunos (λx. x = y) xs "
 +
  have "estaEn y (a # xs) = (y = a ∨ estaEn y xs)"  by simp
 +
  also have "... = (y = a ∨ algunos (λx. x = y) xs) " using HI by simp
 +
  also have "… = (a=y ∨ algunos (λx. x=y) xs)" by auto
 +
  also have "... = (algunos (λx. x = y) (a#xs))"  by simp
 +
  finally show "estaEn y (a # xs) = algunos (λx. x = y) (a # xs) "
 +
    by simp
 +
qed
 +
 +
(* Comentario: Uso de auto *)
 +
 +
(* anaprarod *)
 +
(* Automática*)
 +
lemma "estaEn a xs = algunos (λx. a=x) xs" (is "?P xs")
 +
by (induct xs) auto
 +
 +
(* Detallada (igual que las anteriores pero obviando el paso previo al
 +
  finally) *)
 +
lemma "estaEn a xs = algunos (λx. a=x) xs" (is "?P xs")
 +
proof (induct xs)
 +
  show "?P []" by simp
 +
next
 +
  fix x xs
 +
  assume HI : "?P xs"
 +
  have "estaEn a (x#xs) = (x=a ∨ estaEn a xs)" by simp
 +
  also have "… = (x=a ∨ algunos (λx. a=x) xs)" using HI by simp
 +
  also have "… = (a=x ∨ algunos (λx. a=x) xs)" using HI by auto
 +
  finally show "?P (x#xs)" by simp
 +
qed
 +
 +
(* Comentario: Uso de auto *)
 +
 +
(* antsancab1 *)
 +
(* Demostrar que
 +
algunos (λa. a=x) xs = estaEn x xs
 +
es lo mismo que demostrar
 +
lemma "estaEn a xs = algunos (λx. a=x) xs" *)
 +
 +
lemma "algunos (λa. a=x) xs = estaEn x xs"
 +
by (induct xs) auto
 +
 +
lemma "algunos (λa. a=x) xs = estaEn x xs"
 +
proof (induct xs)
 +
  show "algunos (λa. a = x) [] = estaEn x []" by simp
 +
next
 +
  fix a xs
 +
  assume HI: "algunos (λa. a = x) xs = estaEn x xs"
 +
  have "algunos (λa. a = x) (a # xs) = ((λa. a = x) a ∨ algunos (λa. a = x) xs)" by simp
 +
  also have "... = ((λa. a = x) a ∨ estaEn x xs)" using HI by simp
 +
  also have "... = (estaEn x (a#xs))" by simp  (* no tengo claro cómo simplifica el "(λa. a = x) a" *)
 +
  finally show "algunos (λa. a = x) (a # xs) = estaEn x (a # xs)" by simp
 
qed
 
qed
  
 
end
 
end
 +
 +
(* fracorjim1 *)
 +
lemma estaEnYAlgunos :
 +
"estaEn a xs = algunos (λx. x = a) xs" (is "?P a xs")
 +
proof (induct xs)
 +
show "?P a []" by simp
 +
next
 +
fix a x xs
 +
assume HI : "?P a xs"
 +
have "estaEn a (x#xs) = ((a = x) ∨ estaEn a xs)"
 +
by (simp only:estaEn.simps(2))
 +
  also have "… = (a = x ∨ algunos (λx. x = a) xs)" using HI by simp
 +
  also have "… = ((λx. x = a) x ∨ algunos (λx. x = a) xs)" by auto
 +
  also have "… = algunos (λx. x = a) (x # xs)" by simp
 +
  finally show "?P a (x#xs)" by simp
 +
qed
 +
 +
 
</source>
 
</source>

Revisión actual del 13:05 16 jul 2018

chapter {* R4: Cuantificadores sobre listas *}

theory R4_Cuantificadores_sobre_listas
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. 
  --------------------------------------------------------------------- 
*}

(* danrodcha ivamenjim migtermor dancorgar wilmorort marpoldia1
   ferrenseg paupeddeg pablucoto crigomgom anaprarod serrodcal juacabsou
   rubgonmar josgarsan fraortmoy lucnovdos pabrodmac fracorjim1
   marcarmor13 jeamacpov antsancab1 *)   
fun todos :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
  "todos p []     = True"
| "todos p (x#xs) = (p x ∧ todos p xs)"

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. 
  --------------------------------------------------------------------- 
*}

(* danrodcha ivamenjim migtermor dancorgar marpoldia1 ferrenseg
   wilmorort paupeddeg pablucoto crigomgom anaprarod serrodcal juacabsou
   rubgonmar josgarsan fraortmoy lucnovdos pabrodmac marcarmor13 jeamacpov antsancab1*)  
fun algunos  :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
  "algunos p []     = False"
| "algunos p (x#xs) = (p x ∨ algunos p xs)"

(* fracorjim1. En esta versión el procesamiento se detiene al encontrar
   una coincidencia *) 
fun algunos2  :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
  "algunos2 p [] = False"
| "algunos2 p (x#xs) = (if p x then True else algunos2 p xs)"

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

(* danrodcha ivamenjim migtermor dancorgar marpoldia1 ferrenseg
   wilmorort paupeddeg pablucoto anaprarod serrodcal juacabsou rubgonmar
   josgarsan fraortmoy lucnovdos pabrodmac marcarmor13 jeamacpov antsancab1 *)  
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
by (induct xs) auto

(* fracorjim1 *)
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
apply (induct xs)
apply auto
done

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

(* danrodcha fracorjim1 *)
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)" (is "?R xs")
proof (induct xs)
  show "?R []" by simp
next
  fix a xs 
  assume HI: "?R 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
  also have "… = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))" by blast
  also have "… = (todos P (a#xs) ∧ todos Q (a#xs))" by simp
  finally show "?R (a#xs)" by simp
qed

(* Comentario: Uso de blast. *)

(* ivamenjim wilmorort serrodcal josgarsan*)
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

(* Comentario: Uso de auto. *)

(* dancorgar paupeddeg *)
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 y xs
  assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
  have "todos (λx. P x ∧ Q x) (y#xs) = 
        ((P y ∧ Q y) ∧ (todos (λx. P x ∧ Q x) xs))" by simp
  also have "… = ((P y ∧ Q y) ∧ (todos P xs ∧ todos Q xs))" 
    using HI by simp
  also have "… = ((P y ∧ todos P xs) ∧ (Q y ∧ todos Q xs))" by blast
  also have "… = ((todos P (y#xs)) ∧ (todos Q (y#xs)))" by simp
  finally show "todos (λx. P x ∧ Q x) (y#xs) = 
                (todos P (y#xs) ∧ todos Q (y#xs))" by simp
qed

(* migtermor *)
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 x xs
 assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
 have "(todos (λx. P x ∧ Q x) (x#xs)) = 
       (( P x ∧ Q x) ∧ (todos (λx. P x ∧ Q x) xs))"
   by (simp only: todos.simps(2))
 also have "… = ((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs))" 
   using HI by simp
 also have "… = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))" 
   by arith
 also have "((P x ∧ Q x) ∧ (todos P xs ∧ todos Q xs)) = (((P x)∧(todos P xs)) ∧ ((Q x) ∧ (todos Q xs)))"
   by arith 
   (* Este paso es exactamente el mismo que el anterior, pero sin
      cualquiera de los dos no funciona el "finally show" *) 
 have "… = (((P x)∧(todos P xs))∧((Q x)∧(todos Q xs)))" by simp
 have "… = ((todos P (x#xs))∧(todos Q (x#xs)))" by simp
 finally show "(todos (λx. P x ∧ Q x) (x#xs)) = 
               ((todos P (x#xs)) ∧ (todos Q (x#xs)))" by simp 
qed

(* Comentarios: Ruptura de la cadena de igualdades y uso de arith. *)

(* marpoldia1 *)
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 P xs ∧ todos Q xs))" using HI by simp
  also have "... = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))" by blast
  also have "... = (todos P (a#xs) ∧ todos Q (a#xs)) " by simp
 finally show "todos (λx. P x ∧ Q x) (a#xs) = 
               (todos P (a#xs) ∧ todos Q (a#xs))" by simp 
qed

(* ferrenseg *)
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 n xs
  assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)"
  have "todos (λx. P x ∧ Q x) (n # xs) = 
        (P n ∧ Q n ∧ todos P xs ∧ todos Q xs)" using HI by simp
  also have "… = P n ∧ Q n ∧ todos P xs ∧ todos Q xs" by blast
  also have "⋯ = todos P (n # xs) ∧ todos Q (n # xs)" by simp 
  finally show "todos (λx. P x ∧ Q x) (n # xs) = todos P (n # xs) ∧ todos Q (n # xs)" by simp
oops

(* Comentario: Demostración incompleta. *)

(* lucnovdos *)
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 n xs
  assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)" 
  have "todos (λx. P x ∧ Q x) (n # xs) =  
        ((P n ∧ Q n) ∧ (todos P xs ∧ todos Q xs))" using HI by simp
  also have "... = ((P n ∧ todos P xs) ∧ (Q n ∧ todos Q xs))" by arith
  also have "... = ((todos P(n#xs)) ∧ (todos Q(n#xs)))" by simp
 finally show "todos (λx. P x ∧ Q x) (n#xs) = 
               (todos P (n#xs) ∧ todos Q (n#xs))" by simp 
qed

(* wilmorort pablucoto crigomgom anaprarod juacabsou rubgonmar fraortmoy
   marcarmor13 jeamacpov *)
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
  also have "... = (P a ∧ todos P xs ∧ Q a ∧ todos Q xs)"  by arith
  also have "... = (todos P (a # xs) ∧ todos Q (a # xs))" by simp 
    (* Este paso se puede obviar *)
  finally show "todos (λx. P x ∧ Q x) (a # xs) = 
                (todos P (a # xs) ∧ todos Q (a # xs))" by simp
qed

(* pabrodmac *)
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 x xs
  assume HI: "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)" 
  have "todos (λx. P x ∧ Q x) (x#xs) = 
        (P x ∧ Q x  ∧ todos (λx. P x ∧ Q x) xs)" by simp
  also have "... = (P x ∧ Q x  ∧ (todos P xs ∧ todos Q xs))" 
    using HI by simp
  also have "... = (P x ∧ todos P xs ∧ Q x ∧ todos Q xs)"  by arith
  finally show "todos (λx. P x ∧ Q x) (x#xs) = 
                (todos P (x#xs) ∧ todos Q (x#xs))" by simp
qed

(* antsancab1 *)
lemma "todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)" (is "?R xs")
proof (induct xs)
  show "?R []" by simp
next
  fix a xs
  assume HI: "?R 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
qe

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

(* danrodcha ivamenjim marpoldia1 migtermor ferrenseg wilmorort
   paupeddeg crigomgom anaprarod serrodcal juacabsou rubgonmar pablucoto
   fraortmoy josgarsan lucnovdos pabrodmac marcarmor13 jeamacpov antsancab1 *) 
lemma "todos P (x @ y) = (todos P x ∧ todos P y)"
by (induct x) auto

(* anaprarod dancorgar fracorjim1 *)
lemma "todos P (x @ y) = (todos P x ∧ todos P y)"
apply (induct x)
apply auto
done

text {*
  --------------------------------------------------------------------- 
  Ejercicio 4.2. Demostrar o refutar detalladamente
     todos P (x @ y) = (todos P x ∧ todos P y)
  --------------------------------------------------------------------- 
*}

(* ivamenjim ferrenseg wilmorort dancorgar fraortmoy josgarsan lucnovdos
 rubgonmar *) 
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

(* migtermor serrodcal antsancab1 *)
lemma todos_append1:
  "todos P (x @ y) = (todos P x ∧ todos P y)" (is "?P x")
proof (induct x)
  show "?P []" by simp
next 
  fix a x
  assume HI: "?P x"
  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)" by simp
qed  

(* marpoldia1 *)
lemma todos_append2:
  "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) = todos P (a#(x@y))" by simp
  also have "... = (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

(* paupeddeg *)
lemma todos_append3:
  "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) = todos P (a # (x @ y))" by simp
  also have "... = (todos P [a] ∧ todos P (x @ y)) " by simp
  also have "... = (todos 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

(* crigomgom juacabsou anaprarod*)
lemma todos_append4:
  "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 x xs
  assume HI:"todos P (xs @ y) = (todos P xs ∧ todos P y)"
  have "todos P ((x # xs) @ y) = (P x ∧ todos P (xs @ y ))" by simp
  also have "... = (P x ∧ (todos P xs ∧ todos P y)) " using HI by simp
  also have "... = ((P x ∧ todos P xs) ∧ todos P y)" by simp
  finally show "todos P ((x # xs) @ y) = (todos P (x # xs) ∧ todos P y)" 
    by simp
qed

(* pablucoto marcarmor13 jeamacpov *)
lemma todos_append5:
  "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
  also have "... = (todos P (a#x) ∧ todos P y)" by simp
  finally show "todos P ((a # x) @ y) = (todos P (a # x) ∧ todos P y)" 
    by auto
qed

(* Comentario: Uso de auto. *)

(* danrodcha fracorjim1 *)
lemma todos_append6:
  "todos P (x @ y) = (todos P x ∧ todos P y)" (is "?Q x")
proof (induct x)
  show "?Q []" by simp
next
fix x a assume HI: "?Q x"
  have "todos P ((a # x) @ y) = todos P (a # x @ y)" by simp
  also have "… = ((P a) ∧ todos P (x @ y))" by simp
  also have "… = ((P a) ∧ (todos P x ∧ todos P y))" using HI by simp
  also have "… = (todos P (a # x) ∧ todos P y)" by simp
  finally show "?Q (a # x)" by simp
qed

(* pabrodmac *)
lemma todos_append7:
  "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

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

(* migtermor ivamenjim marpoldia1 serrodcal anaprarod paupeddeg
   dancorgar antsancab1 fracorjim1 *) 
lemma "todos P (rev xs) = todos P xs" 
apply (induct xs)
apply simp
apply (simp add: todos_append)
apply auto
done

(* ferrenseg crigomgom rubgonmar fraortmoy josgarsan danrodcha lucnovdos
   pabrodmac *) 
lemma "todos P (rev xs) = todos P xs"
by (induct xs) (auto simp add: todos_append)
 
(* wilmorort *)
lemma "todos P (rev xs) = todos P xs"
by (induct xs, simp, simp add: todos_append,auto)

(* Comentario: Pasos dentro de by *)

(* juacabsou *)
lemma "todos P (rev xs) = todos P xs"
apply (induct xs, simp, simp add: todos_append, auto) 
done

(* Comentario: Pasos dentro de apply *)

(* pablucoto marcarmor13 jeamacpov *)
lemma "todos P (rev xs) = todos P xs"
by (induct xs) (auto, simp_all add: todos_append) 

(* Comentario: Uso de simp_all *)  
  
lemma "todos P (rev xs) = todos P xs"
by (induct xs) (simp_all add: todos_append, auto)

(* Comentario: Uso de add en simp_all *)  
  
text {*
  --------------------------------------------------------------------- 
  Ejercicio 5.2. Demostrar o refutar detalladamente
     todos P (rev xs) = todos P xs
  --------------------------------------------------------------------- 
*}

(* migtermor *)
lemma auxiliar:
 "rev (a#xs) = rev xs @ [a]"
by auto

lemma "todos P (rev xs) = todos P xs" (is "?Q xs")
proof (induct xs)
  show "?Q []" by (simp only: rev.simps(1))
next 
  fix a xs
  assume HI: "?Q xs"
  have "todos P (rev (a#xs)) = (todos P (rev xs @ [a]))" 
    by (simp add: "auxiliar")
  have "… = ((todos P (rev xs)) ∧ (todos P [a]))" 
    by (simp add: todos_append)
  have "… =  (todos P (rev xs) ∧ P a)" by simp
  also have Aux: "… = (todos P xs ∧ P a)" using HI by simp
  have Aux1: "… = (P a ∧ todos P xs)" by arith
  have "(todos P (rev xs) ∧ P a) = (P a ∧ todos P xs)" 
    using Aux Aux1 by simp
  finally show "todos P (rev (a#xs)) = todos P (a#xs)" 
    by (simp add: todos_append)
qed

(* Comentarios: 
   + Ruptura de cadena de igualdades.
   + Uso de hechos auxiliares
   + Uso de arith
*)   

(* marpoldia1 ferrenseg crigomgom serrodcal juacabsou rubgonmar
   josgarsan pablucoto pabrodmac lucnovdos marcarmor13 jeamacpov *) 
lemma "todos P (rev xs) = todos P xs"
proof (induct xs)
show "todos P (rev []) = todos P []" by simp
next
fix a xs
  assume HI: "todos P (rev xs) = todos P xs"
  have "todos P (rev (a # xs)) = (todos P ((rev xs)@[a]))" by simp
  also have "... = (todos P (rev xs) ∧ todos P [a])" 
    by (simp add:todos_append)
  also have "... = (todos P xs ∧ P a)" using HI by simp
  also have "... = (P a ∧ todos P xs)" by arith
  also have "... = (todos P (a#xs))" by simp
  finally show "todos P (rev (a # xs)) = (todos P (a#xs))" by simp    
qed

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

(* fraortmoy serrodcal *)
lemma "todos P (rev xs) = todos P xs"
proof (induct xs)
  show "todos P (rev []) = todos P []" by simp
next
  fix a xs 
  assume H1: "todos P (rev xs) = todos P xs"
  have " todos P (rev (a # xs)) = todos P (rev xs @ [a])" by simp
  also have "… = (todos P (rev xs) ∧ todos P [a])" 
    by (simp add:todos_append)
  also have "… = (todos P xs ∧ todos P [a])" using H1 by simp
  also have "… = (todos P [a] ∧ todos P xs)" by arith
  finally show  "todos P (rev (a # xs)) = todos P (a#xs)" by simp
qed

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

(* wilmorort *)
lemma "todos P (rev xs) = todos P xs" (is "?P xs")
proof (induct xs) 
  show "?P []" by simp 
next
  fix a xs
  assume HI: "?P xs"
  have "todos P (rev (a#xs)) = todos P ((rev xs) @ [a])" by simp
  also have "... = (todos P(rev xs) ∧ todos P [a])" 
    by (simp add: todos_append)
  also have "... = (todos P xs ∧ todos P [a])" using HI by simp
  also have "... = (todos P [a] ∧ todos P xs)" 
    by (simp add: HOL.conj_commute)
  also have "... = todos P([a]@(xs))" by (simp)
  finally show  "todos P (rev (a#xs))= todos P (a # xs)" by simp
qed

(* Comentario: Uso de HOL.conj_commute *)

(* anaprarod fracorjim1 *)  
(* es igual que las anteriores pero con el final también con patrones *)
lemma "todos P (rev xs) = todos P xs" (is "?P xs")
proof (induct xs)
  show "?P []" by auto
  next
  fix a xs
  assume HI: "?P xs"
  have "todos P (rev (a#xs)) = todos P (rev xs @ [a])" by simp
  also have "… = (todos P (rev xs) ∧ todos P [a])" 
    by (simp add: todos_append)
  also have "… = (todos P xs ∧ todos P [a])" using HI by simp
  also have "… = (todos P [a] ∧ todos P xs)" by arith
  also have "… = todos P (a#xs)" by simp
  finally show "?P (a # xs)" by simp
qed

(* danrodcha *)
lemma "todos P (rev xs) = todos P xs" (is "?Q xs")
proof (induct xs)
  show "?Q []" by simp
next
  fix a xs assume HI: "?Q xs"
  have "todos P (rev (a#xs)) = todos P ((rev xs) @ [a])" by simp
  also have "… = (todos P (rev xs) ∧ todos P [a])" 
    by (simp add:todos_append)
  also have "… = (todos P xs ∧ todos P [a])" using HI by simp
  also have "… = (todos P [a] ∧ todos P xs)" 
    by (simp add: HOL.conj_commute)
  also have "… = todos P (a # xs)" by simp
  finally show "?Q (a # xs)" by simp
qed

(* antsancab1 *)
lemma "todos P (rev xs) = todos P xs"
proof (induct xs)
  show "todos P (rev[]) = todos P[]" by simp
next
  fix a xs
  assume HI: "todos P (rev xs) = todos P xs"
  have "todos P (rev(a#xs)) = todos P (rev xs @ [a])" by simp
  also have "... = (todos P (rev xs) ∧ todos P [a])" by (simp add: todos_append)
  also have "... = (todos P xs ∧ todos P [a])" using HI by simp
  also have "... = (todos P [a] ∧ todos P xs)" by arith
  also have "... = (todos P ([a] @ xs))" by (simp add: todos_append)
  also have "... = (todos P (a#xs))" 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)
  --------------------------------------------------------------------- 
*}

lemma "algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)"
oops

(* migtermor ivamenjim ferrenseg paupeddeg crigomgom serrodcal wilmorort
   juacabsou rubgonmar anaprarod marpoldia1 fraortmoy josgarsan
   danrodcha pablucoto lucnovdos marcarmor13 jeamacpov antsancab1 fracorjim1 pabrodmac *)  
lemma "algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)" 
quickcheck
oops
(* Quickcheck encuentra el siguiente contraejemplo: 
      P={a1}, Q={a2}, xs={a1,a2}. 
   En este ejemplo:
   · "algunos (λx. P x ∧ Q x) xs = False"
   · "(algunos P xs ∧ algunos Q xs) = True" *)

(* dancorgar *)
lemma "algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)"
proof -
  assume H1: "xs = [a, b]"
  assume H2: "P a = True"
  assume H3: "Q a = False"
  assume H4: "P b = False"
  assume H5: "Q b = True" 
  have F1: "(algunos P xs ∧ algunos Q xs) = True" 
    using H1 H2 H3 H4 H5 by simp
  have F2: "algunos (λx. P x ∧ Q x) xs = False" 
    using H1 H2 H3 H4 H5 by simp
  have "algunos (λx. P x ∧ Q x) xs ≠ (algunos P xs ∧ algunos Q xs)" 
    using F1 F2 by simp
oops

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

(* ivamenjim migtermor marpoldia1 crigomgom rubgonmar wilmorort anaprarod 
   fraortmoy juacabsou paupeddeg josgarsan danrodcha pablucoto lucnovdos
   marcarmor13 jeamacpov antsancab1 pabrodmac *) 
lemma "algunos P (map f xs) = algunos (P o f) xs"
by (induct xs) auto

(* ferrenseg *)
lemma "algunos P (map f xs) = algunos (P o f) xs"
by (induct xs) simp_all

(* anaprarod dancorgar serrodcal fracorjim1 *)
lemma "algunos P (map f xs) = algunos (P o f) xs"
apply (induct xs)
apply auto
done

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

(* migtermor *)
lemma AUX: "algunos (λa. P (f a)) xs = algunos (P o f) xs"
by (induct xs) auto

lemma "algunos P (map f xs) = algunos (P o f) xs" (is "?Q xs")
proof (induct xs)
  show "?Q []" by simp
next
  fix x xs
  assume HI: "?Q xs"
  have "algunos P (map f (x#xs)) = (algunos P ((f x)#(map f xs)))" 
    by simp
  also have "… = ((P (f x)) ∨ (algunos P (map f xs)))" 
    by (simp only: algunos.simps(2))
  also have "… = ((P (f x)) ∨ (algunos (P o f) xs))" 
  proof (cases)
    assume C1: "(P (f x))"
    have Aux: "((P (f x)) ∨ (algunos P (map f xs))) = True" 
      using C1 by simp
    have  Aux1: "… = ((P (f x)) ∨ (algunos (P o f) xs))" 
      using C1 by simp 
    then show "((P (f x)) ∨ (algunos P (map f xs))) = 
               ((P (f x)) ∨ (algunos (P o f) xs))" 
      using Aux Aux1 by simp
  next
    assume C2: "¬(P (f x))"
    have Aux2: "((P (f x)) ∨ (algunos P (map f xs))) = 
                (algunos P (map f xs))" using C2 by simp
    have Aux3: "… = (algunos (P o f) xs)" using HI by (simp add: AUX)
    also have "… =  ((P (f x)) ∨ (algunos (P o f) xs))" 
      using C2 by simp
    then show "((P (f x)) ∨ (algunos P (map f xs))) = 
               ((P (f x)) ∨ (algunos (P o f) xs))" 
      using Aux2 Aux3 by simp
   qed
  also have "… = (((P o f) x) ∨ (algunos (P o f) xs))" by simp
  also have "… = (algunos (P o f) (x#xs))" by simp
  finally show "algunos P (map f (x#xs)) = (algunos (P o f) (x#xs))" 
    by simp
qed

(* Comentario: Se puede simplificar. *)

(* ferrenseg *)
lemma "algunos P (map f xs) = algunos (P ∘ f) xs"
proof (induct xs)
  show "algunos P (map f []) = algunos (P ∘ f) []" by simp
next
  fix x xs
  assume HI: "algunos P (map f xs) = algunos (P ∘ f) xs"
  show "algunos P (map f (x # xs)) = algunos (P ∘ f) (x # xs)"
  proof -
    have "algunos P (map f (x # xs)) = algunos P ((f x) # (map f xs))" 
      by simp
    also have "… = ((P (f x)) ∨ (algunos P (map f xs)))" by simp
    also have "… = (((P ∘ f) x) ∨ (algunos (P ∘ f) xs))" 
      using HI by simp
    also have "… = algunos (P ∘ f) (x # xs)" by simp
    finally show ?thesis by simp
  qed
qed

(* ivamenjim *)
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 "... = (algunos P (map f [a]) ∨ algunos P (map f xs))" 
    by simp 
  also have "... = (algunos P (map f [a]) ∨ algunos (P ∘ f) xs)" 
    using HI by simp 
  finally show "algunos P (map f (a # xs)) = algunos (P ∘ f) (a # xs)" 
    by simp
qed

(* crigomgom rubgonmar anaprarod marpoldia1 juacabsou danrodcha
   paupeddeg josgarsan lucnovdos pabrodmac *) 
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 x xs
  assume HI: "algunos P (map f xs) = algunos (P ∘ f) xs"
  have "algunos P (map f (x # xs))  = algunos P ((f x) # (map f xs))" 
    by simp
  also have "... = (P (f x) ∨ algunos P (map f xs))" by simp
  also have "... = (P (f x) ∨ algunos (P ∘ f) xs)" using HI by simp
  also have "... = ((P ∘ f) x ∨ algunos (P ∘ f) xs)" by simp
  finally show "algunos P (map f (x # xs)) = algunos (P ∘ f) (x # xs)" 
    by simp
qed

(* wilmorort pablucoto marcarmor13 jeamacpov *)
lemma "algunos P (map f xs) = algunos (P o f) xs" (is "?P xs" )
proof (induct xs)
  show "?P []" by simp
next
  fix a xs
  assume HI: "algunos P (map f xs) = algunos (P ∘ f) xs"
  have "algunos P (map f (a # xs))  = (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

(* fraortmoy serrodcal *)
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 H1: "algunos P (map f xs) = algunos (P ∘ f) xs"
  have  "algunos P (map f (a # xs)) = 
         (algunos P (map f [a]) ∨ algunos P (map f xs))" by simp
  also have "… = (algunos (P ∘ f) [a] ∨  algunos (P ∘ f) xs )" 
    using H1 by simp
  also have "… = algunos (P ∘ f) (a#xs)" by simp
  finally show "algunos P (map f (a # xs)) = algunos (P ∘ f) (a#xs)" 
    by simp
qed

(* danrodcha fracorjim1 *)
lemma "algunos P (map f xs) = algunos (P o f) xs" (is "?Q xs")
proof (induct xs)
  show "?Q []" by simp
next
  fix a xs assume HI: "?Q 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 blast
  also have "… = ((P ∘ f) a ∨ algunos (P ∘ f) xs)"  by simp
  also have "… = algunos (P ∘ f) (a # xs)" by simp
  finally show "?Q (a # xs)" by blast
qed

(* dancorgar *)
lemma "algunos P (map f xs) = algunos (P o f) xs"
proof (induct xs)
  show "algunos P (map f []) = algunos (P o f) []" by simp
next
  fix x xs
  assume HI: "algunos P (map f xs) = algunos (P o f) xs"
  have "algunos P (map f (x#xs)) = ((P (f x)) ∨ (algunos P (map f xs)))" 
    by simp
  also have "… = ((P (f x)) ∨ (algunos (P o f) xs))" using HI by simp
  finally show "algunos P (map f (x#xs)) = algunos (P o f) (x#xs)" 
    by simp
qed

(* antsancab1 *)
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 "... = algunos (P ∘ f) (a#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)
  --------------------------------------------------------------------- 
*}

(* ivamenjim marpoldia1 paupeddeg crigomgom rubgonmar  wilmorort
   fraortmoy danrodcha pablucoto dancorgar josgarsan anaprarod juacabsou
   lucnovdos marcarmor13 jeamacpov antsancab1 pabrodmac *)  
lemma "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
by (induct xs) auto

(* ferrenseg *)
lemma "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
by (induct xs) simp_all

(* anaprarod fracorjim1 *)
lemma "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
apply (induct  xs)
apply auto
done

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

(* ivamenjim ferrenseg marpoldia1 wilmorort dancorgar josgarsan
   juacabsou serrodcal lucnovdos rubgonmar *) 
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

(* migtermor crigomgom *)
lemma algunos_append2:
  "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)" (is "?Q xs")
proof (induct xs)
  show "?Q []" by simp
next 
  fix x xs
  assume HI: "?Q xs"
  have "algunos P ((x#xs) @ ys) = algunos P (x#(xs @ ys))" by simp
  also have "… = ((P x) ∨ (algunos P (xs @ ys)))" by simp
  also have "… = ((P x) ∨ (algunos P xs) ∨ (algunos P ys))" 
    using HI by simp
  also have "… = ((algunos P (x#xs)) ∨ (algunos P ys))" by simp
  finally show "algunos P ((x#xs) @ ys) = 
                (algunos P (x#xs) ∨ algunos P ys)" by simp
qed

(* paupeddeg*)
lemma algunos_append3:
  "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) = 
        (algunos P [a] ∨ ( algunos P (xs @ ys)))" by simp
  also have "... = (algunos 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

(* fraortmoy *)
lemma algunos_append4:
  "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 H1: "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)"
  have "algunos P ((a # xs) @ ys) = 
        (algunos P [a] ∨ algunos P (xs @ ys))" by simp
  also have "… = (algunos P [a] ∨ algunos P xs ∨ algunos P ys)" 
    using H1 by simp
  also have "… = ((algunos P [a] ∨ algunos P xs) ∨ algunos P ys)" 
    by simp
  also have "… = (algunos P (a#xs) ∨ algunos P ys)" by simp
  finally show "algunos P ((a # xs) @ ys) = 
                (algunos P (a#xs) ∨ algunos P ys)" by simp
qed

(* danrodcha pablucoto anaprarod marcarmor13 jeamacpov pabrodmac *)
lemma algunos_append5:
  "algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)" (is "?Q xs")
proof (induct xs)
  show "?Q []" by simp
next
  fix a xs assume HI: "?Q xs"
  have "algunos P ((a#xs) @ ys) = algunos P (a#(xs @ ys))" by simp
  also have "… = (algunos P [a] ∨ algunos P (xs @ ys))" by simp
  also have "… = (algunos P [a] ∨ algunos P xs ∨ algunos P ys)" 
    using HI by simp
  also have "… = (algunos P (a # xs) ∨ algunos P ys)" by simp
  finally show "?Q (a # xs)" by simp
qed

(* antsancab1 *)
lemma algunos_append6: "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
  also have "... = (algunos P (a#xs) ∨ algunos P ys)" 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
  --------------------------------------------------------------------- 
*}

(* ivamenjim migtermor marpoldia1 rubgonmar paupeddeg dancorgar
   anaprarod serrodcal antsancab1 fracorjim1 *) 
lemma "algunos P (rev xs) = algunos P xs"
apply (induct xs)
apply simp
apply (simp add: algunos_append)
apply auto
done

(* ferrenseg crigomgom danrodcha pablucoto josgarsan pabrodmac lucnovdos
   marcarmor13 jeamacpov *) 
lemma "algunos P (rev xs) = algunos P xs"
by (induct xs) (auto simp add: algunos_append)

(* wilmorort juacabsou *)
lemma "algunos P (rev xs) = algunos P xs"
by (induct xs,simp,simp add: algunos_append,auto) 

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

(* migtermor *)
lemma auxiliar1:
 "rev (a#xs) = rev xs @ [a]"
by auto 

lemma "algunos P (rev xs) = algunos P xs" (is "?Q xs")
proof (induct xs)
  show "?Q []" by simp
next
  fix x xs
  assume HI: "?Q xs"
  have "algunos P (rev (x#xs)) = (algunos P (rev xs @ [x]))" 
    using auxiliar1 by simp
  also have "… = ((algunos P (rev xs)) ∨ (algunos P [x]))" 
    by (simp add: algunos_append)
  also have "… = ((P x) ∨ (algunos P (rev xs)))" by simp arith
  also have "… = ((P x) ∨ (algunos P xs))" using HI by simp
  finally show "algunos P (rev (x#xs)) = (algunos P (x#xs))" by simp
qed

(* ferrenseg *)
lemma "algunos P (rev xs) = algunos P xs"
proof (induct xs)
  show "algunos P (rev []) = algunos P []" by simp
next
  fix x xs
  assume HI: "algunos P (rev xs) = algunos P xs"
  show "algunos P (rev (x # xs)) = algunos P (x # xs)"
  proof -
    have "algunos P (rev (x # xs)) = algunos P ((rev xs) @ [x])" by simp
    also have "… = (algunos P (rev xs) ∨ algunos P [x])" 
      by (simp add: algunos_append)
    also have "… = (algunos P xs ∨ algunos P [x])" using HI by simp
    also have "… = (algunos P xs ∨ P x)" by simp
    also have "… = (P x ∨ algunos P xs)" by auto
    also have "… = algunos P (x # xs)" by simp
    finally show ?thesis by simp
  qed
qed
 
(* ivamenjim marpoldia1*)
lemma "algunos P (rev xs) = algunos P xs" (is "?P xs")
proof (induct xs)
  show "?P []" by simp
next 
  fix a xs
  assume HI: "?P xs"
  have "algunos P (rev (a # xs)) = (algunos P ((rev xs)@[a]))" by simp
  also have "... = ((algunos P (rev xs)) ∨ algunos P [a])" 
    by (simp add: algunos_append)
  also have "... = (algunos P xs ∨ algunos P [a])" using HI by simp
  also have "... = (algunos P [a] ∨ algunos P xs)" by arith
  finally show "algunos P (rev (a # xs)) = algunos P (a # xs)" by simp
qed

(* paupeddeg dancorgar serrodcal lucnovdos*)
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 "... = ((algunos P (rev xs)) ∨ (algunos P [a]))" 
    by (simp add: algunos_append)
  also have "... = ((algunos P xs) ∨ (algunos P [a]))" using HI by simp
  also have "... = ((algunos P [a]) ∨ (algunos P xs))" by arith
  finally show "algunos P (rev (a # xs)) = algunos P (a # xs)" by simp
qed

(* crigomgom pablucoto anaprarod rubgonmar juacabsou marcarmor13 jeamacpov pabrodmac *)
lemma "algunos P (rev xs) = algunos P xs"
proof (induct xs)
  show "algunos P (rev []) = algunos P []" by simp
next
  fix x xs
  assume HI: " algunos P (rev xs) = algunos P xs" 
  have "algunos P (rev (x # xs)) = algunos P ((rev xs) @ [x])" by simp
  also have "... = (algunos P (rev xs) ∨ algunos P [x])"  
    by (simp add: algunos_append)
  also have "... = (algunos P xs  ∨ algunos P [x])" using HI by simp
  also have "... = (algunos P xs ∨ P x)" by simp
  also have "... = (P x ∨ algunos P xs)" by arith
  also have "... = algunos P (x#xs)" by simp
  finally show "algunos P (rev (x # xs)) = algunos P (x # xs)" by simp
qed

(*wilmorort*)
lemma "algunos P (rev xs) = algunos P xs"  (is "?P xs")
proof (induct xs) 
  show "?P []" by simp 
next
  fix a xs
  assume HI: "?P xs"
  have "algunos P (rev (a#xs)) = algunos P ((rev xs) @ [a])" by simp
  also have "... = (algunos P(rev xs) ∨ algunos P [a])" 
    by (simp add: algunos_append)
  also have "... = (algunos P xs ∨ algunos P [a])" using HI by simp
  also have "... = (algunos P [a] ∨ algunos P xs)" 
    by (simp add: HOL.disj_commute)
  also have "... = algunos P([a]@(xs))" by (simp)
  finally show  "algunos  P (rev (a#xs))= algunos P (a # xs)" by simp
qed

(* danrodcha *)
lemma "algunos P (rev xs) = algunos P xs" (is "?Q xs")
proof (induct xs)
  show "?Q []" by simp
next
  fix a xs assume HI: "?Q xs"
  have "algunos P (rev (a#xs)) = algunos P ((rev xs) @ [a])" by simp
  also have "… = (algunos P (rev xs) ∨ algunos P [a])" 
    by (simp add:algunos_append)
  also have "… = (algunos P xs ∨ algunos P [a])" using HI by simp
  also have "… = (algunos P [a] ∨ algunos P xs)" 
    by (simp add: HOL.disj_commute)
  also have "… = algunos P (a # xs)" by simp
  finally show "?Q (a # xs)" by simp
qed

(* antsancab1 *)
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 "... = (algunos P (rev xs) ∨ algunos P [a])" by (simp add:algunos_append)
  also have "... = (algunos P xs ∨ algunos P [a])" using HI by simp
  also have "... = (algunos P [a] ∨ algunos P xs)" by auto
  also have "... = algunos P (a#xs)" 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.
  --------------------------------------------------------------------- 
*}

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

lemma "algunos (λx. P x ∨ Q x) xs = 
       ((algunos (λx. P x) xs) ∨ (algunos (λx. Q x) xs))" (is "?R xs")
proof (induct xs)
  show "?R []" by simp
next
  fix x xs
  assume HI: "?R xs"
  have "algunos (λx. P x ∨ Q x) (x#xs) = 
        (((λx. P x ∨ Q x) x) ∨ (algunos (λx. P x ∨ Q x) xs))" by simp
  also have "… = ((P x ∨ Q x) ∨ (algunos (λx. P x ∨ Q x) xs))" by simp
  also have H1: "… = ((((λx. P x) x) ∨ (algunos (λx. P x) xs)) ∨ 
                       (((λx. Q x) x) ∨ (algunos (λx. Q x) xs)))"
    using HI by simp arith
  have H2: "… = ((algunos (λx. P x) (x#xs)) ∨ (algunos (λx. Q x) (x#xs)))" 
    by simp
  have C: "(algunos (λx. P x ∨ Q x) (x#xs)) = 
           ((algunos (λx. P x) (x#xs)) ∨ (algunos (λx. Q x) (x#xs)))" 
    using H1 H2 by simp
  finally show "(algunos (λx. P x ∨ Q x) (x#xs)) = 
                ((algunos (λx. P x) (x#xs)) ∨ (algunos (λx. Q x) (x#xs)))" 
    using C by simp
qed

(* CComentario: Ruptura de la cadena de igualdades. *)

(* ferrenseg *)
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 x xs
  assume HI: "algunos (λx. (P x ∨ Q x)) xs = (algunos P xs ∨ algunos Q xs)"
  show "algunos (λx. P x ∨ Q x) (x # xs) = 
        (algunos P (x # xs) ∨ algunos Q (x # xs))"
  proof -
    have "algunos (λx. P x ∨ Q x) (x # xs) = 
          ((P x) ∨ (Q x) ∨ algunos (λx. P x ∨ Q x) xs)" by simp
    also have "… = ((P x) ∨ (Q x) ∨ algunos P xs ∨ algunos Q xs)" 
      using HI by simp
    also have "… = (((P x) ∨ algunos P xs) ∨ ((Q x) ∨ algunos Q xs))" 
      by auto
    also have "… = (algunos P (x # xs) ∨ algunos Q (x # xs))" by simp
    finally show ?thesis by simp 
  qed
qed

(* Comentario: Uso de auto *)

(* ivamenjim marpoldia1 paupeddeg *)
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
  finally show "algunos (λx. P x ∨ Q x) (a # xs) = 
                (algunos P (a # xs) ∨ algunos Q (a # xs))" by auto
qed

(* Comentario: Uso de auto *)

(* wilmorort danrodcha anaprarod juacabsou rubgonmar*)
lemma "algunos (λx. P x ∨ Q x) xs = 
       (¬todos(λx. ¬P x)xs ∨ ¬todos(λx. ¬Q x)xs)"
by (induct xs) auto

(* wilmorort *)
lemma "algunos (λx. P x ∨ Q x) xs = 
       (¬todos(λx. ¬P x)xs ∨ ¬todos(λx. ¬Q x)xs)"
      (is "?P xs")
proof (induct xs)
  show "?P []" by simp
next
  fix a xs
  assume HI: "?P 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 ∨  
                    (¬ todos (λx. ¬ P x) xs ∨ ¬ todos (λx. ¬ Q x) xs))" 
    using HI by simp
  also have "... = (P a ∨ ¬ todos (λx. ¬ P x) xs ∨ 
                    Q a ∨  ¬ todos (λx. ¬ Q x) xs )" by arith
  finally show  "algunos (λx. P x ∨ Q x) (a # xs) = 
                 (~ todos (λx. ¬ P x) (a # xs) ∨ 
                   ~ todos (λx. ¬ Q x) (a # xs))" by simp
qed

(* danrodcha *)
lemma "algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)" 
      (is "?R xs")
proof (induct xs)
  show "?R []" by simp
next
  fix a xs assume HI: "?R xs"
    have 1:" (Q a ∨ algunos P xs) = (algunos P xs ∨ Q a)" 
      by (simp add: HOL.disj_commute)
    have "algunos (λx. P x ∨ Q x) (a # xs) = 
          (algunos P [a] ∨ algunos 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)" 
      using 1 by simp
    also have "… = (algunos P (a # xs) ∨ algunos Q (a # xs))" by simp
    finally show "?R (a # xs)" by simp
qed

(* dancorgar *)
lemma "algunos (λx. P x ∧ Q x) xs ⟹ (algunos P xs ∧ algunos Q xs)"
apply (induct xs)
apply auto
done

(* dancorgar *)
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 xf xs
  assume HI: "algunos (λx. P x ∧ Q x) xs ⟹ (algunos P xs ∧ algunos Q xs)"
  have F1: "algunos (λx. P x ∧ Q x) (xf#xs) ⟹ 
            ((P xf ∧ Q xf) ∨ algunos (λx. P x ∧ Q x) xs)" by simp
  also have F2: "… ⟹ (P xf ∧ Q xf ∨ (algunos P xs ∧ algunos Q xs))" 
    using HI by simp
  have F3: "((P xf ∧ Q xf) ∨ (algunos P xs ∧ algunos Q xs)) ⟹ 
            ((P xf ∨ algunos P xs) ∧ (Q xf ∨ algunos Q xs))" by blast
  have F4: "((P xf ∨ algunos P xs) ∧ (Q xf ∨ algunos Q xs)) ⟹ 
     (algunos P (xf#xs) ∧ algunos Q (xf#xs))" by simp
  show "algunos (λx. P x ∧ Q x) (xf#xs) ⟹ 
        (algunos P (xf#xs) ∧ algunos Q (xf#xs))"
    using F1 F2 F3 F4 by blast
qed

(* pablucoto crigomgom serrodcal marcarmor13 jeamacpov pabrodmac *)
-- "Automatica"
lemma "algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)"
by (induct xs) auto

-- "Detallada"
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 arith 
  also have "… = (algunos P (a#xs) ∨ algunos Q (a#xs))" by simp
  finally show "algunos (λx. P x ∨ Q x) (a # xs) = 
                (algunos P (a # xs) ∨ algunos Q (a # xs)) " by simp
qed

(* anaprarod juacabsou rubgonmar *)
lemma "algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)" 
      (is "?P xs")
proof (induct xs)
  show "?P []" by simp
next
  fix x xs
  assume HI: "?P xs"
  have "algunos (λx. P x ∨ Q x) (x#xs) =
        (P x ∨ Q x ∨ algunos (λx. P x ∨ Q x) xs)" by simp
  also have "… = (P x ∨ Q x ∨ algunos P xs ∨ algunos Q xs)" 
    using HI by simp
  also have "… = (P x ∨ algunos P xs ∨ Q x ∨ algunos Q xs)" by arith
  finally show "?P (x#xs)"  by simp
qed

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

lemma "algunos(λx. P x ∨ Q x) xs = (algunos(λx. P x) xs ∨ algunos(λx. Q x) 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 "... = (algunos P (a # xs) ∨ algunos Q (a # 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)
  --------------------------------------------------------------------- 
*}

(* ivamenjim wilmorort migtermor marpoldia1 crigomgom rubgonmar
   paupeddeg danrodcha pablucoto dancorgar josgarsan anaprarod juacabsou
   lucnovdos serrodcal marcarmor13 jeamacpov antsancab1 pabrodmac *)  
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
by (induct xs) auto

(* ferrenseg *)
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
by (induct xs) simp_all

(* anaprarod *)
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)" 
apply (induct xs)
apply auto
done

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

(* ivamenjim migtermor marpoldia1 crigomgom paupeddeg josgarsan
   juacabsou serrodcal wilmorort *) 
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
  finally show "algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))" 
    by simp
qed

(* ferrenseg *)
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
proof (induct xs)
  show "algunos P [] = (¬ todos (λx. (¬ P x)) [])" by simp
next
  fix x xs
  assume HI: "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
  show "algunos P (x # xs) = (¬ todos (λx. (¬ P x)) (x # xs))"
  proof - 
    have "algunos P (x # xs) = ((P x) ∨ algunos P xs)" by simp
    also have "… = ((P x) ∨ ¬ todos (λx. (¬ P x)) xs)" using HI by simp
    also have "… = (¬ (¬ (P x) ∧ todos (λx. (¬ P x)) xs))" by simp
    also have "… = (¬ todos (λx. (¬ P x)) (x # xs))" by simp
    finally show ?thesis by simp
  qed
qed

(* danrodcha pablucoto anaprarod rubgonmar marcarmor13 jeamacpov pabrodmac *)
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)" (is "?Q xs")
proof (induct xs)
  show "?Q []" by simp
next
  fix a xs assume HI: "?Q 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 "… = (¬ todos(λx. (¬ P x)) (a # xs))" by simp
  finally show "?Q (a # xs)" by simp
qed

(* dancorgar*)
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
proof (induct xs)
  show "algunos P [] = (¬ todos (λx. (¬ P x)) [])" by simp
next
  fix xf xs
  assume HI: "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
  have "algunos P (xf#xs) = ((P xf) ∨ algunos P xs)" by simp
  also have "… = ( (P xf) ∨ (¬ todos (λx. (¬ P x)) xs) )" 
    using HI by simp
  also have "… = (¬((¬P xf) ∧ (todos (λx. (¬ P x)) xs)))" by simp
  finally show "algunos P (xf#xs) = (¬todos (λx. (¬ P x)) (xf#xs))" 
    by simp
qed

(* lucnovdos*)
lemma "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
proof (induct xs)
  show "algunos P [] = (¬ todos (λx. (¬ P x)) [])" by simp
next
  fix n xs
  assume HI: "algunos P xs = (¬ todos (λx. (¬ P x)) xs)"
  have "algunos P (n#xs) = ((P n) ∨ (algunos P xs))" by simp
  also have "… = ((P n) ∨ (¬ todos (λx. (¬ P x)) xs))" using HI by simp
  also have "… = (¬((¬P n) ∧  todos (λx. (¬ P x)) xs))" by simp
  also have "… = (¬ todos (λx. (¬ P x)) (n#xs))" by simp
  finally show "algunos P (n#xs) = (¬ todos (λx. (¬ P x)) (n#xs))" 
    by simp
qed

(* antsancab1 *)
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) (a#xs)))" by auto
  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
  --------------------------------------------------------------------- 
*}

(* ivamenjim ferrenseg migtermor serrodcal crigomgom rubgonmar
   marpoldia1 paupeddeg danrodcha dancorgar pablucoto anaprarod
   juacabsou lucnovdos marcarmor13 wilmorort jeamacpov fracorjim1 pabrodmac *)  
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"

(* antsancab1 *)
fun estaEn1 :: "'a ⇒ 'a list ⇒ bool" where
  "estaEn1 x [] = False"
| "estaEn1 x (a#xs) = (if x = a then True else estaEn1 x xs )"   (* Se detiene al encontrar la primera coincidencia *)

value "estaEn1 (2::nat) [3,2,4] = True"
value "estaEn1 (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.
  --------------------------------------------------------------------- 
*}

(* migtermor crigomgom  *)
lemma "estaEn x xs = (algunos (λa. a=x) xs)"
by (induct xs) auto

lemma auxiliar13:
 "(x=a) = ((λa. a=x) a)"
by auto

lemma "estaEn x xs = (algunos (λa. a=x) xs)" (is "?P xs")
proof (induct xs)
  show "?P []" by simp
next
  fix a xs
  assume HI: "?P xs"
  have "estaEn x (a#xs) = ((a=x) ∨ (estaEn x xs))" by simp
  also have H: "… = ((a=x) ∨ (algunos (λa. a=x) xs))" using HI by simp
  also have "… = (((λa. a=x) a) ∨ (algunos (λa. a=x) xs))" 
    using auxiliar13  by simp
  also have "… = (algunos (λa. a=x) (a#xs))" by simp
  have C: "estaEn x (a#xs) = (algunos (λa. a=x) (a#xs))" using H by simp 
  finally show "estaEn x (a#xs) = (algunos (λa. a=x) (a#xs))" 
    using C by simp
qed

(* Comentario: Ruptura de la cadena de igualdades. Se puede simplificar. *)

(* ferrenseg *)
lemma estaEn_algunos:
  "estaEn y xs = algunos (λx. x=y) xs"
by (induct xs) auto

lemma estaEn_algunos_2:
  "estaEn y xs = algunos (λx. x=y) xs"
proof (induct xs)
  show "estaEn y [] = algunos (λx. x=y) []" by simp
next
  fix x xs
  assume HI: "estaEn y xs = algunos (λx. x=y) xs"
  show "estaEn y (x # xs) = algunos (λx. x=y) (x # xs)"
  proof -
    have "estaEn y (x # xs) = (y=x ∨ estaEn y xs)" by simp
    also have "… = (y=x ∨ algunos (λx. x=y) xs)" using HI by simp
    also have "… = (x=y ∨ algunos (λx. x=y) xs)" by auto
    also have "… = algunos (λx. x=y) (x # xs)" by simp
    finally show ?thesis by simp
  qed
qed

(* Comentario: Uso de auto *)

(* crigomgom paupeddeg dancorgar juacabsou serrodcal lucnovdos wilmorort *)
lemma "estaEn a xs = algunos (λx. x = a) xs"
by (induct xs) auto

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

(* ivamenjim marpoldia1 *)
lemma "estaEn x xs = algunos (λy. x=y) xs"
by (induct xs) auto

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

(* Comentarios:
   + Uso de (op = x)
   + Uso de auto
*)

(* danrodcha *)
lemma "estaEn a xs = algunos (op = a) xs"
by (induct xs) auto

(* danrodcha *)
lemma "estaEn a xs = algunos (op = a) xs"
proof (induct xs)
  show "estaEn a [] = algunos (op = a) []" by simp
next
  fix x xs 
  assume HI: "estaEn a xs = algunos (op = a) xs"
  have "estaEn a (x # xs) = ((x = a) ∨ (estaEn a xs))" by simp
  also have "… = (x = a ∨ algunos (op = a) xs)" using HI by simp
  also have "… = ((op = a) x ∨ algunos (op = a) xs)" 
    by (simp add:HOL.eq_commute)
  also have "… = algunos (op = a) (x # xs)" by simp
  finally show "estaEn a (x # xs) = algunos (op = a) (x # xs)" by simp
qed

(* pablucoto marcarmor13 jeamacpov pabrodmac *)
-- "Automatica"
lemma " estaEn y xs = algunos (λx. x=y) xs"
by (induct xs) auto

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

(* Comentario: Uso de auto *)

(* anaprarod *)
(* Automática*)
lemma "estaEn a xs = algunos (λx. a=x) xs" (is "?P xs")
by (induct xs) auto

(* Detallada (igual que las anteriores pero obviando el paso previo al
   finally) *) 
lemma "estaEn a xs = algunos (λx. a=x) xs" (is "?P xs")
proof (induct xs)
  show "?P []" by simp
next
  fix x xs
  assume HI : "?P xs"
  have "estaEn a (x#xs) = (x=a ∨ estaEn a xs)" by simp
  also have "… = (x=a ∨ algunos (λx. a=x) xs)" using HI by simp
  also have "… = (a=x ∨ algunos (λx. a=x) xs)" using HI by auto
  finally show "?P (x#xs)" by simp
qed

(* Comentario: Uso de auto *)

(* antsancab1 *)
(* Demostrar que
algunos (λa. a=x) xs = estaEn x xs
es lo mismo que demostrar
lemma "estaEn a xs = algunos (λx. a=x) xs" *)

lemma "algunos (λa. a=x) xs = estaEn x xs"
by (induct xs) auto

lemma "algunos (λa. a=x) xs = estaEn x xs"
proof (induct xs)
  show "algunos (λa. a = x) [] = estaEn x []" by simp
next
  fix a xs
  assume HI: "algunos (λa. a = x) xs = estaEn x xs"
  have "algunos (λa. a = x) (a # xs) = ((λa. a = x) a ∨ algunos (λa. a = x) xs)" by simp
  also have "... = ((λa. a = x) a ∨ estaEn x xs)" using HI by simp
  also have "... = (estaEn x (a#xs))" by simp  (* no tengo claro cómo simplifica el "(λa. a = x) a" *)
  finally show "algunos (λa. a = x) (a # xs) = estaEn x (a # xs)" by simp
qed

end

(* fracorjim1 *)
lemma estaEnYAlgunos :
	"estaEn a xs = algunos (λx. x = a) xs" (is "?P a xs")
proof (induct xs)
	show "?P a []" by simp
next
	fix a x xs
	assume HI : "?P a xs"
	have "estaEn a (x#xs) = ((a = x) ∨ estaEn a xs)"
		by (simp only:estaEn.simps(2))
  also have "… = (a = x ∨ algunos (λx. x = a) xs)" using HI by simp
  also have "… = ((λx. x = a) x ∨ algunos (λx. x = a) xs)" by auto
  also have "… = algunos (λx. x = a) (x # xs)" by simp
  finally show "?P a (x#xs)" by simp
qed