Acciones

Relación 6

De Razonamiento automático (2016-17)

chapter {* R6: Recorridos de árboles *}

theory R6_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))".
  --------------------------------------------------------------------- 
*}

(* ivamenjim marpoldia1 manmorjim1 *)

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

(* ivamenjim marpoldia1*)

fun preOrden :: "'a arbol ⇒ 'a list" where
  "preOrden (H t) = [t]"
| "preOrden (N t i d) = [t] @ (preOrden i) @ (preOrden d)"

(* danrodcha crigomgom manmorjim1 *)
fun preOrden1 :: "'a arbol ⇒ 'a list" where
  "preOrden1 (H x) = [x]"
| "preOrden1 (N x i d) = x#preOrden1 i @ preOrden1 d"

value "preOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))  
      = [e,c,a,d,g,f,h]" 
value "preOrden1 (N e (N c (H a) (H d)) (N g (H f) (H h)))  
      = [e,c,a,d,g,f,h]" 

(* danrodcha *)
lemma "preOrden a = preOrden1 a"
by (induct a) simp_all

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

(* ivamenjim  danrodcha crigomgom marpoldia1 manmorjim1 *)

fun postOrden :: "'a arbol ⇒ 'a list" where
  "postOrden (H t) = [t]"
| "postOrden (N t i d) = (postOrden i) @ (postOrden d) @ [t]"

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

(* ivamenjim crigomgom marpoldia1*)

fun inOrden :: "'a arbol ⇒ 'a list" where
  "inOrden (H t) = [t]"
| "inOrden (N t i d) = (inOrden i) @ [t] @ (inOrden d)"

(* danrodcha manmorjim1 *)
fun inOrden1 :: "'a arbol ⇒ 'a list" where
  "inOrden1 (H t) = [t]"
| "inOrden1 (N t i d) = inOrden1 i @ t#inOrden1 d"

value "inOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))
       = [a,c,d,e,f,g,h]"
value "inOrden1 (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))
  --------------------------------------------------------------------- 
*}

(* ivamenjim danrodcha crigomgom marpoldia1*)

fun espejo :: "'a arbol ⇒ 'a arbol" where
  "espejo (H t) = H t"
| "espejo (N t i d) = N t (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)
  --------------------------------------------------------------------- 
*}

(* ivamenjim *)

lemma  "preOrden (espejo a) = rev (postOrden a)" (is "?P a")
proof (induct a)
  fix x 
  show "?P (H x)" by simp 
next
  fix x 
  fix i assume h1: "?P i"
  fix d 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 
  finally show "preOrden (espejo (N x i d)) = rev (postOrden (N x i d))" by simp
qed

(* danrodcha *)
lemma  "preOrden (espejo a) = rev (postOrden a)"
by (induct a) simp_all

(* danrodcha crigomgom*)
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 HIi: "?P i"
  assume HId: "?P d"
  have "preOrden (espejo (N x i d)) = preOrden (N x (espejo d) (espejo i))"
    by (simp only: espejo.simps(2))
  also have "… = x#preOrden (espejo d) @ preOrden (espejo i)"
    by (simp only: preOrden.simps(2))
  also have"… = x#rev (postOrden d) @ rev (postOrden i)" 
    using HIi HId by simp
  also have "… = rev (postOrden (N x i d))" by simp
  finally show "?P (N x i d)" by simp
qed

(* danrodcha *)
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 HIi: "?P i"
  assume HId: "?P d"
  show "?P (N x i d)" using HIi HId by simp
qed

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 7. Demostrar que
     postOrden (espejo a) = rev (preOrden a)
  --------------------------------------------------------------------- 
*}

(* ivamenjim crigomgom*)

lemma "postOrden (espejo a) = rev (preOrden a)" (is "?P a")
proof (induct a)
  fix x 
  show "?P (H x)" by simp 
next
  fix x 
  fix i assume h1: "?P i"
  fix d 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 
  finally show "postOrden (espejo (N x i d)) = rev (preOrden (N x i d))" by simp
qed

(* danrodcha *)
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 HIi: "?P i"
  assume HId: "?P d"
  show "?P (N x i d)" using HIi HId by simp
qed

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 8. Demostrar que
     inOrden (espejo a) = rev (inOrden a)
  --------------------------------------------------------------------- 
*}

(* ivamenjim crigomgom*)

theorem "inOrden (espejo a) = rev (inOrden a)" (is "?P a")
proof (induct a)
  fix x 
  show "?P (H x)" by simp 
next
  fix x 
  fix i assume h1: "?P i"
  fix d 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 
  finally show "inOrden (espejo (N x i d)) = rev (inOrden (N x i d))" by simp
qed

(* danrodcha *)
theorem "inOrden (espejo a) = rev (inOrden a)"
by (induct a) simp_all

(* danrodcha *)
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 HIi: "?P i"
  assume HId: "?P d"
  show "?P (N x i d)" using HIi HId 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
  --------------------------------------------------------------------- 
*}

(* danrodcha crigomgom*)
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
  --------------------------------------------------------------------- 
*}

(* danrodcha crigomgom*)
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
  --------------------------------------------------------------------- 
*}

(* danrodcha crigomgom*)
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
  --------------------------------------------------------------------- 
*}

(* danrodcha *)
lemma aux_ej12: "inOrden a ≠ []"
apply (induct a) 
apply simp
apply simp
done

(* danrodcha *)
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 HIi: "?P i"
  assume HId: "?P d"
  have "last (inOrden (N x i d)) = last (inOrden i @ [x] @ inOrden d)" 
    by (simp only: inOrden.simps(2))
  also have "… = last (inOrden d)" by (simp add: aux_ej12)
  also have "… = extremo_derecha d" using HId by simp
  also have "… = extremo_derecha (N x i d)" by simp
  finally show "?P (N x i d)" by simp
qed

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 13. Demostrar o refutar
     hd (inOrden a) = extremo_izquierda a
  --------------------------------------------------------------------- 
*}

(* danrodcha *)
theorem "hd (inOrden a) = extremo_izquierda a" (is "?P a")
proof (induct a)
  fix x
  show "?P (H x)" by simp
next
  fix x i d 
  assume HIi: "?P i"
  assume HId: "?P d"
  have "hd (inOrden (N x i d)) = hd (inOrden i @ [x] @ inOrden d)" 
    by (simp only: inOrden.simps(2))
  also have "… = hd (inOrden i)" by (simp add: aux_ej12)
  also have "… = extremo_izquierda i" using HIi by simp
  also have "… = extremo_izquierda (N x i d)" by simp
  finally show "?P (N x i d)" by simp
qed

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 14. Demostrar o refutar
     hd (preOrden a) = last (postOrden a)
  --------------------------------------------------------------------- 
*}

(* danrodcha *)
theorem "hd (preOrden a) = last (postOrden a)" (is "?P a")
proof (induct a)
  fix x
  show "?P (H x)" by simp
  fix x i d
  show "?P (N x i d)" by simp
qed

(* danrodcha *)
theorem "hd (preOrden a) = last (postOrden a)" (is "?P a")
proof (induct a)
  fix x
  show "?P (H x)" by simp
  fix x i d
  assume HIi: "?P i"
  assume HId: "?P d"
  have "hd (preOrden (N x i d)) = hd (x#preOrden i @ preOrden d)"
    by (simp only: preOrden.simps(2))
  also have "… = x" by simp
  also have "… = last (postOrden i @ postOrden d @ [x])" by simp
  also have "… = last (postOrden (N x i d))" 
    by (simp only: postOrden.simps(2))
  finally show "?P (N x i d)" by simp
qed

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 15. Demostrar o refutar
     hd (preOrden a) = raiz a
  --------------------------------------------------------------------- 
*}

(* danrodcha *)
theorem "hd (preOrden a) = raiz a" (is "?P a")
proof (induct a)
  fix x
  show "?P (H x)" by simp
  fix x i d
  assume HIi: "?P i"
  assume HId: "?P d"
  have "hd (preOrden (N x i d)) = hd (x#preOrden i @ preOrden d)"
    by (simp only: preOrden.simps(2))
  also have "… = x" by simp
  also have "… = raiz (N x i d)" by simp
  finally show "?P (N x i d)" by simp
qed

(* danrodcha *)
theorem "hd (preOrden a) = raiz a" (is "?P a")
proof (induct a)
  fix x
  show "?P (H x)" by simp
  fix x i d
  show "?P (N x i d)" by simp
qed

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 16. Demostrar o refutar
     hd (inOrden a) = raiz a
  --------------------------------------------------------------------- 
*}

(*crigomgom*)
theorem "hd (inOrden a) = raiz a"
quickcheck
oops

(* danrodcha:
Auto 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 *)

text {*  
  --------------------------------------------------------------------- 
  Ejercicio 17. Demostrar o refutar
     last (postOrden a) = raiz a
  --------------------------------------------------------------------- 
*}

(* danrodcha *)
theorem "last (postOrden a) = raiz a" (is "?P a")
proof (induct a)
  fix x
  show "?P (H x)" by simp
  fix x i d
  show "?P (N x i d)" by simp
qed

(* danrodcha *)
theorem "last (postOrden a) = raiz a" (is "?P a")
proof (induct a)
  fix x
  show "?P (H x)" by simp
  fix x i d
  assume HIi: "?P i"
  assume HId: "?P d"
  have "last (postOrden (N x i d)) = last (postOrden i @ postOrden d @ [x])"
    by (simp only: postOrden.simps(2))
  also have "… = x" by simp
  also have "… = raiz (N x i d)" by (simp only: raiz.simps(2))
  finally show "?P (N x i d)" by simp
qed

end