Diferencia entre revisiones de «Relación 5»
De Razonamiento automático (2018-19)
Línea 333: | Línea 333: | ||
*} | *} | ||
− | theorem "hd (preOrden a) = last (postOrden a)" | + | (* pabalagon *) |
− | + | theorem hdPreOrden_lastPostOrden: | |
+ | "hd (preOrden a) = last (postOrden a)" (is "?P a") | ||
+ | proof (induct a) | ||
+ | fix x | ||
+ | show "?P (H x)" by simp | ||
+ | next | ||
+ | fix x::'a | ||
+ | fix i d | ||
+ | have "hd (preOrden (N x i d)) = hd (x # preOrden i @ preOrden d)" by simp | ||
+ | also have "... = x" by simp | ||
+ | also have "... = last [x]" by simp | ||
+ | also have "... = last (postOrden i @ postOrden d @ [x])" by simp | ||
+ | finally show "?P (N x i d)" by simp | ||
+ | qed | ||
text {* | text {* | ||
Línea 343: | Línea 356: | ||
*} | *} | ||
− | theorem "hd (preOrden a) = raiz a" | + | (* pabalagon *) |
− | + | theorem hdPreOrden_raiz: "hd (preOrden a) = raiz a" (is "?P a") | |
+ | proof (induct a) | ||
+ | fix x | ||
+ | show "?P (H x)" by simp | ||
+ | next | ||
+ | fix x::'a | ||
+ | fix i d | ||
+ | have "hd (preOrden (N x i d)) = hd (x # preOrden i @ preOrden d)" by simp | ||
+ | also have "... = x" by simp | ||
+ | finally show "?P (N x i d)" by (simp only: raiz.simps(2)) | ||
+ | qed | ||
text {* | text {* | ||
Línea 353: | Línea 376: | ||
*} | *} | ||
+ | (* pabalagon *) | ||
theorem "hd (inOrden a) = raiz a" | theorem "hd (inOrden a) = raiz a" | ||
− | oops | + | quickcheck |
+ | (* | ||
+ | Quickcheck found a counterexample: | ||
+ | a = N a⇩1 (H a⇩2) (H a⇩1) | ||
+ | Evaluated terms: | ||
+ | hd (inOrden a) = a⇩2 | ||
+ | raiz a = a⇩1 *) | ||
+ | oops | ||
text {* | text {* | ||
Línea 363: | Línea 394: | ||
*} | *} | ||
+ | (* pabalagon *) | ||
theorem "last (postOrden a) = raiz a" | theorem "last (postOrden a) = raiz a" | ||
− | + | proof - | |
+ | have "last (postOrden a) = hd (preOrden a)" | ||
+ | by (simp add: hdPreOrden_lastPostOrden) | ||
+ | also have "... = raiz a" by (simp add: hdPreOrden_raiz) | ||
+ | finally show "?thesis" . | ||
+ | qed | ||
end | end | ||
</source> | </source> |
Revisión del 21:09 18 dic 2018
chapter {* R5: Recorridos de árboles *}
theory R5_Recorridos_de_arboles
imports Main
begin
text {*
---------------------------------------------------------------------
Ejercicio 1. Definir el tipo de datos arbol para representar los
árboles binarios que tiene información en los nodos y en las hojas.
Por ejemplo, el árbol
e
/ \
/ \
c g
/ \ / \
a d f h
se representa por "N e (N c (H a) (H d)) (N g (H f) (H h))".
---------------------------------------------------------------------
*}
datatype 'a arbol = H "'a" | N "'a" "'a arbol" "'a arbol"
value "N e (N c (H a) (H d)) (N g (H f) (H h))"
text {*
---------------------------------------------------------------------
Ejercicio 2. Definir la función
preOrden :: "'a arbol ⇒ 'a list"
tal que (preOrden a) es el recorrido pre orden del árbol a. Por
ejemplo,
preOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))
= [e,c,a,d,g,f,h]
---------------------------------------------------------------------
*}
(* pabalagon raffergon2 *)
fun preOrden :: "'a arbol ⇒ 'a list" where
"preOrden (H x) = [x]" |
"preOrden (N x i d) = x # preOrden i @ preOrden d"
value "preOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))
= [e,c,a,d,g,f,h]"
text {*
---------------------------------------------------------------------
Ejercicio 3. Definir la función
postOrden :: "'a arbol ⇒ 'a list"
tal que (postOrden a) es el recorrido post orden del árbol a. Por
ejemplo,
postOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))
= [e,c,a,d,g,f,h]
---------------------------------------------------------------------
*}
(* pabalagon raffergon2 *)
fun postOrden :: "'a arbol ⇒ 'a list" where
"postOrden (H x) = [x]" |
"postOrden (N x i d) = postOrden i @ postOrden d @ [x]"
value "postOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))
= [a,d,c,f,h,g,e]"
text {*
---------------------------------------------------------------------
Ejercicio 4. Definir la función
inOrden :: "'a arbol ⇒ 'a list"
tal que (inOrden a) es el recorrido in orden del árbol a. Por
ejemplo,
inOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))
= [a,c,d,e,f,g,h]
---------------------------------------------------------------------
*}
(* pabalagon raffergon2 *)
fun inOrden :: "'a arbol ⇒ 'a list" where
"inOrden (H x) = [x]" |
"inOrden (N x i d) = inOrden i @ [x] @ inOrden d"
value "inOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))
= [a,c,d,e,f,g,h]"
text {*
---------------------------------------------------------------------
Ejercicio 5. Definir la función
espejo :: "'a arbol ⇒ 'a arbol"
tal que (espejo a) es la imagen especular del árbol a. Por ejemplo,
espejo (N e (N c (H a) (H d)) (N g (H f) (H h)))
= N e (N g (H h) (H f)) (N c (H d) (H a))
---------------------------------------------------------------------
*}
(* pabalagon raffergon2*)
fun espejo :: "'a arbol ⇒ 'a arbol" where
"espejo (H x) = H x" |
"espejo (N x i d) = N x (espejo d) (espejo i)"
value "espejo (N e (N c (H a) (H d)) (N g (H f) (H h)))
= N e (N g (H h) (H f)) (N c (H d) (H a))"
text {*
---------------------------------------------------------------------
Ejercicio 6. Demostrar que
preOrden (espejo a) = rev (postOrden a)
---------------------------------------------------------------------
*}
(* pabalagon raffergon2*)
lemma "preOrden (espejo a) = rev (postOrden a)" (is "?P a")
proof (induct a)
fix x
show "?P (H x)" by simp
next
fix x i d
assume H1: "?P i"
assume H2: "?P d"
have "preOrden (espejo (N x i d)) =
preOrden (N x (espejo d) (espejo i))" by simp
also have "... = x # preOrden (espejo d) @ preOrden (espejo i)" by simp
also have "... = x # rev (postOrden d) @ rev (postOrden i)"
using H1 H2 by simp
also have "... = rev (postOrden d @ [x]) @ rev (postOrden i)" by simp
also have "... = rev (postOrden i @ postOrden d @ [x])" by simp
finally show "?P (N x i d)" by simp
qed
text {*
---------------------------------------------------------------------
Ejercicio 7. Demostrar que
postOrden (espejo a) = rev (preOrden a)
---------------------------------------------------------------------
*}
(* pabalagon *)
lemma "postOrden (espejo a) = rev (preOrden a)" (is "?P a")
proof (induct a)
fix x
show "?P (H x)" by simp
next
fix x i d
assume H1: "?P i" and H2: "?P d"
have "postOrden (espejo (N x i d)) =
postOrden (N x (espejo d) (espejo i))" by simp
also have "... = postOrden (espejo d) @ postOrden (espejo i) @ [x]"
by simp
also have "... = rev (preOrden d) @ rev (preOrden i) @ [x]"
using H1 H2 by simp
also have "... = rev (preOrden i @ preOrden d) @ rev [x]" by simp
also have "... = rev (x # preOrden i @ preOrden d)" by simp
finally show "?P (N x i d)" by simp
qed
(* raffergon2 *)
lemma "postOrden (espejo a) = rev (preOrden a)" (is "?P a")
proof (induct a)
fix x
show "?P (H x)" by simp
next
fix x i d
assume H1: "?P i"
assume H2: "?P d"
have "postOrden (espejo (N x i d)) = postOrden (N x (espejo d) (espejo i))" by simp
also have "... = postOrden (espejo d) @ postOrden (espejo i) @ [x]"
by simp
also have "... = rev(preOrden d) @ rev (preOrden i) @ [x]"
using H1 H2 by simp
also have "... = rev(preOrden d) @ rev (x # preOrden i)" by simp
also have "... = rev(x # preOrden i @ preOrden d)" by simp
finally show "?P (N x i d)" by simp
qed
text {*
---------------------------------------------------------------------
Ejercicio 8. Demostrar que
inOrden (espejo a) = rev (inOrden a)
---------------------------------------------------------------------
*}
(* pabalagon *)
theorem "inOrden (espejo a) = rev (inOrden a)" (is "?P a")
proof (induct a)
fix x
show "?P (H x)" by simp
next
fix x i d
assume H1: "?P i" and H2: "?P d"
have "inOrden (espejo (N x i d)) = inOrden (N x (espejo d) (espejo i))"
by simp
also have "... = inOrden (espejo d) @ [x] @ inOrden (espejo i)" by simp
also have "... = rev (inOrden d) @ [x] @ rev (inOrden i)"
using H1 H2 by simp
also have "... = rev (inOrden i @ [x] @ inOrden d)" by simp
finally show "?P (N x i d)" by simp
qed
(* raffergon2 *)
theorem "inOrden (espejo a) = rev (inOrden a)" (is "?P a")
proof (induct a)
fix x
show "?P (H x)" by simp
next
fix x i d
assume H1: "?P i"
assume H2: "?P d"
have "inOrden (espejo (N x i d)) = inOrden(N x (espejo d) (espejo i))" by simp
also have "... = inOrden (espejo d) @ [x] @ inOrden (espejo i)" by simp
also have "... = rev (inOrden d) @ [x] @ rev (inOrden i)"
using H1 H2 by simp
also have "... = rev(x # inOrden d) @ rev (inOrden i)" by simp
also have "... = rev(inOrden i @ x # inOrden d)" by simp
finally show "?P (N x i d)" by simp
qed
text {*
---------------------------------------------------------------------
Ejercicio 9. Definir la función
raiz :: "'a arbol ⇒ 'a"
tal que (raiz a) es la raiz del árbol a. Por ejemplo,
raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e
---------------------------------------------------------------------
*}
(* pabalagon raffergon2*)
fun raiz :: "'a arbol ⇒ 'a" where
"raiz (H x) = x" |
"raiz (N x i d) = x"
value "raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e"
text {*
---------------------------------------------------------------------
Ejercicio 10. Definir la función
extremo_izquierda :: "'a arbol ⇒ 'a"
tal que (extremo_izquierda a) es el nodo más a la izquierda del árbol
a. Por ejemplo,
extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a
---------------------------------------------------------------------
*}
(* pabalagon raffergon2 *)
fun extremo_izquierda :: "'a arbol ⇒ 'a" where
"extremo_izquierda (H x) = x" |
"extremo_izquierda (N x i d) = extremo_izquierda i"
value "extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a"
text {*
---------------------------------------------------------------------
Ejercicio 11. Definir la función
extremo_derecha :: "'a arbol ⇒ 'a"
tal que (extremo_derecha a) es el nodo más a la derecha del árbol
a. Por ejemplo,
extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h
---------------------------------------------------------------------
*}
(* pabalagon raffergon2*)
fun extremo_derecha :: "'a arbol ⇒ 'a" where
"extremo_derecha (H x) = x" |
"extremo_derecha (N x i d) = extremo_derecha d"
value "extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h"
text {*
---------------------------------------------------------------------
Ejercicio 12. Demostrar o refutar
last (inOrden a) = extremo_derecha a
---------------------------------------------------------------------
*}
(* pabalagon *)
lemma inOrdenNotNil: "inOrden a ≠ []" (is "?P a")
proof (induct a)
fix x
show "?P (H x)" by simp
next
fix x i d
have "?P (N x i d) = ((inOrden i @ [x] @ inOrden d) ≠ [])" by simp
also have "... = ((inOrden i ≠ []) ∨ ([x] ≠ []) ∨ (inOrden d ≠ []))" by simp
also have "... = ([x] ≠ [])" by simp
finally show "?P (N x i d)" by simp
qed
theorem "last (inOrden a) = extremo_derecha a" (is "?P a")
proof (induct a)
fix x
show "?P (H x)" by simp
next
fix x i d
assume HI: "?P d"
have "last (inOrden (N x i d)) = last (inOrden i @ [x] @ inOrden d)" by simp
also have "... = last (x # inOrden d)" by simp
also have "... = last (inOrden d)" by (simp add: inOrdenNotNil)
also have "... = extremo_derecha d" using HI by simp
also have "... = extremo_derecha (N x i d)" by simp
finally show "?P (N x i d)" .
qed
text {*
---------------------------------------------------------------------
Ejercicio 13. Demostrar o refutar
hd (inOrden a) = extremo_izquierda a
---------------------------------------------------------------------
*}
(* pabalagon *)
theorem "hd (inOrden a) = extremo_izquierda a" (is "?P a")
proof (induct a)
fix x::'a
have "hd (inOrden (H x)) = hd [x]" by simp
also have "... = x" by simp
also have "... = extremo_izquierda (H x)" by simp
finally show "?P (H x)" .
next
fix x i d
assume HI: "?P i"
have "hd (inOrden (N x i d)) = hd (inOrden i @ [x] @ inOrden d)" by simp
also have "... = hd ((inOrden i @ [x]) @ inOrden d)" by simp
also have "... = hd (inOrden i)" by (simp add: inOrdenNotNil)
also have "... = extremo_izquierda i" using HI by simp
also have "... = extremo_izquierda (N x i d)" by simp
finally show "?P (N x i d)" .
qed
text {*
---------------------------------------------------------------------
Ejercicio 14. Demostrar o refutar
hd (preOrden a) = last (postOrden a)
---------------------------------------------------------------------
*}
(* pabalagon *)
theorem hdPreOrden_lastPostOrden:
"hd (preOrden a) = last (postOrden a)" (is "?P a")
proof (induct a)
fix x
show "?P (H x)" by simp
next
fix x::'a
fix i d
have "hd (preOrden (N x i d)) = hd (x # preOrden i @ preOrden d)" by simp
also have "... = x" by simp
also have "... = last [x]" by simp
also have "... = last (postOrden i @ postOrden d @ [x])" by simp
finally show "?P (N x i d)" by simp
qed
text {*
---------------------------------------------------------------------
Ejercicio 15. Demostrar o refutar
hd (preOrden a) = raiz a
---------------------------------------------------------------------
*}
(* pabalagon *)
theorem hdPreOrden_raiz: "hd (preOrden a) = raiz a" (is "?P a")
proof (induct a)
fix x
show "?P (H x)" by simp
next
fix x::'a
fix i d
have "hd (preOrden (N x i d)) = hd (x # preOrden i @ preOrden d)" by simp
also have "... = x" by simp
finally show "?P (N x i d)" by (simp only: raiz.simps(2))
qed
text {*
---------------------------------------------------------------------
Ejercicio 16. Demostrar o refutar
hd (inOrden a) = raiz a
---------------------------------------------------------------------
*}
(* pabalagon *)
theorem "hd (inOrden a) = raiz a"
quickcheck
(*
Quickcheck found a counterexample:
a = N a⇩1 (H a⇩2) (H a⇩1)
Evaluated terms:
hd (inOrden a) = a⇩2
raiz a = a⇩1 *)
oops
text {*
---------------------------------------------------------------------
Ejercicio 17. Demostrar o refutar
last (postOrden a) = raiz a
---------------------------------------------------------------------
*}
(* pabalagon *)
theorem "last (postOrden a) = raiz a"
proof -
have "last (postOrden a) = hd (preOrden a)"
by (simp add: hdPreOrden_lastPostOrden)
also have "... = raiz a" by (simp add: hdPreOrden_raiz)
finally show "?thesis" .
qed
end