Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quellcode-Bibliothek Tree_Forest.thy   Sprache: Isabelle

 
(*  Title:      ZF/Induct/Tree_Forest.thy
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
    Copyright   1994  University of Cambridge
*)


section Trees and forests, a mutually recursive type definition

theory Tree_Forest imports ZF begin

subsection Datatype definition

consts
  tree :: "i \ i"
  forest :: "i \ i"
  tree_forest :: "i \ i"

datatype "tree(A)" = Tcons ("a \ A""f \ forest(A)")
  and "forest(A)" = Fnil | Fcons ("t \ tree(A)""f \ forest(A)")

(* FIXME *)
lemmas tree'induct =
    tree_forest.mutual_induct [THEN conjunct1, THEN spec, THEN [2] rev_mp, of concl: _ t, consumes 1]
  and forest'induct =
    tree_forest.mutual_induct [THEN conjunct2, THEN spec, THEN [2] rev_mp, of concl: _ f, consumes 1]
  for t f

declare tree_forest.intros [simp, TC]

lemma tree_def: "tree(A) \ Part(tree_forest(A), Inl)"
  by (simp only: tree_forest.defs)

lemma forest_def: "forest(A) \ Part(tree_forest(A), Inr)"
  by (simp only: tree_forest.defs)


text 
  \medskip 🍋tree_forest(A) as the union of 🍋tree(A)
  and 🍋forest(A).


lemma tree_subset_TF: "tree(A) \ tree_forest(A)"
    unfolding tree_forest.defs
  apply (rule Part_subset)
  done

lemma treeI [TC]: "x \ tree(A) \ x \ tree_forest(A)"
  by (rule tree_subset_TF [THEN subsetD])

lemma forest_subset_TF: "forest(A) \ tree_forest(A)"
    unfolding tree_forest.defs
  apply (rule Part_subset)
  done

lemma treeI' [TC]: "x \ forest(A) \ x \ tree_forest(A)"
  by (rule forest_subset_TF [THEN subsetD])

lemma TF_equals_Un: "tree(A) \ forest(A) = tree_forest(A)"
  apply (insert tree_subset_TF forest_subset_TF)
  apply (auto intro!: equalityI tree_forest.intros elim: tree_forest.cases)
  done

lemma tree_forest_unfold:
  "tree_forest(A) = (A \ forest(A)) + ({0} + tree(A) \ forest(A))"
    🍋 NOT useful, but interesting \dots
  supply rews = tree_forest.con_defs tree_def forest_def
    unfolding tree_def forest_def
  apply (fast intro!: tree_forest.intros [unfolded rews, THEN PartD1]
    elim: tree_forest.cases [unfolded rews])
  done

lemma tree_forest_unfold':
  "tree_forest(A) =
    A × Part(tree_forest(A), λw. Inr(w)) +
    {0} + Part(tree_forest(A), λw. Inl(w)) * Part(tree_forest(A), λw. Inr(w))"
  by (rule tree_forest_unfold [unfolded tree_def forest_def])

lemma tree_unfold: "tree(A) = {Inl(x). x \ A \ forest(A)}"
    unfolding tree_def forest_def
  apply (rule Part_Inl [THEN subst])
  apply (rule tree_forest_unfold' [THEN subst_context])
  done

lemma forest_unfold: "forest(A) = {Inr(x). x \ {0} + tree(A)*forest(A)}"
    unfolding tree_def forest_def
  apply (rule Part_Inr [THEN subst])
  apply (rule tree_forest_unfold' [THEN subst_context])
  done

text 
  \medskip Type checking for recursor: Not needed; possibly interesting?


lemma TF_rec_type:
  "\z \ tree_forest(A);
      x f r. [ A;  f  forest(A);  r  C(f)
] ==> b(x,f,r)  C(Tcons(x,f));
      c  C(Fnil);
      t f r1 r2. [ tree(A);  f  forest(A);  r1  C(t); r2  C(f)
] ==> d(t,f,r1,r2)  C(Fcons(t,f))
] ==> tree_forest_rec(b,c,d,z)  C(z)"
  by (induct_tac z) simp_all

lemma tree_forest_rec_type:
  "\\x f r. \x \ A; f \ forest(A); r \ D(f)
] ==> b(x,f,r)  C(Tcons(x,f));
      c  D(Fnil);
      t f r1 r2. [ tree(A);  f  forest(A);  r1  C(t); r2  D(f)
] ==> d(t,f,r1,r2)  D(Fcons(t,f))
] ==> ( tree(A).    tree_forest_rec(b,c,d,t)  C(t)) 
          ( forest(A). tree_forest_rec(b,c,d,f)  D(f))"
    🍋 Mutually recursive version.
    unfolding Ball_def
  apply (rule tree_forest.mutual_induct)
  apply simp_all
  done


subsection Operations

consts
  map :: "[i \ i, i] \ i"
  size :: "i \ i"
  preorder :: "i \ i"
  list_of_TF :: "i \ i"
  of_list :: "i \ i"
  reflect :: "i \ i"

primrec
  "list_of_TF (Tcons(x,f)) = [Tcons(x,f)]"
  "list_of_TF (Fnil) = []"
  "list_of_TF (Fcons(t,tf)) = Cons (t, list_of_TF(tf))"

primrec
  "of_list([]) = Fnil"
  "of_list(Cons(t,l)) = Fcons(t, of_list(l))"

primrec
  "map (h, Tcons(x,f)) = Tcons(h(x), map(h,f))"
  "map (h, Fnil) = Fnil"
  "map (h, Fcons(t,tf)) = Fcons (map(h, t), map(h, tf))"

primrec
  "size (Tcons(x,f)) = succ(size(f))"
  "size (Fnil) = 0"
  "size (Fcons(t,tf)) = size(t) #+ size(tf)"

primrec
  "preorder (Tcons(x,f)) = Cons(x, preorder(f))"
  "preorder (Fnil) = Nil"
  "preorder (Fcons(t,tf)) = preorder(t) @ preorder(tf)"

primrec
  "reflect (Tcons(x,f)) = Tcons(x, reflect(f))"
  "reflect (Fnil) = Fnil"
  "reflect (Fcons(t,tf)) =
    of_list (list_of_TF (reflect(tf)) @ Cons(reflect(t), Nil))"


text 
  \medskip list_of_TF and of_list.


lemma list_of_TF_type [TC]:
    "z \ tree_forest(A) \ list_of_TF(z) \ list(tree(A))"
  by (induct set: tree_forest) simp_all

lemma of_list_type [TC]: "l \ list(tree(A)) \ of_list(l) \ forest(A)"
  by (induct set: list) simp_all

text 
  \medskip map.


lemma
  assumes "\x. x \ A \ h(x): B"
  shows map_tree_type: "t \ tree(A) \ map(h,t) \ tree(B)"
    and map_forest_type: "f \ forest(A) \ map(h,f) \ forest(B)"
  using assms
  by (induct rule: tree'induct forest'induct) simp_all

text 
  \medskip size.


lemma size_type [TC]: "z \ tree_forest(A) \ size(z) \ nat"
  by (induct set: tree_forest) simp_all


text 
  \medskip preorder.


lemma preorder_type [TC]: "z \ tree_forest(A) \ preorder(z) \ list(A)"
  by (induct set: tree_forest) simp_all


text 
  \medskip Theorems about list_of_TF and of_list.


lemma forest_induct [consumes 1, case_names Fnil Fcons]:
  "\f \ forest(A);
      R(Fnil);
      t f. [ tree(A);  f  forest(A);  R(f)] ==> R(Fcons(t,f))
] ==> R(f)"
  🍋 Essentially the same as list induction.
  apply (erule tree_forest.mutual_induct
      [THEN conjunct2, THEN spec, THEN [2] rev_mp])
    apply (rule TrueI)
   apply simp
  apply simp
  done

lemma forest_iso: "f \ forest(A) \ of_list(list_of_TF(f)) = f"
  by (induct rule: forest_induct) simp_all

lemma tree_list_iso: "ts: list(tree(A)) \ list_of_TF(of_list(ts)) = ts"
  by (induct set: list) simp_all


text 
  \medskip Theorems about map.


lemma map_ident: "z \ tree_forest(A) \ map(\u. u, z) = z"
  by (induct set: tree_forest) simp_all

lemma map_compose:
    "z \ tree_forest(A) \ map(h, map(j,z)) = map(\u. h(j(u)), z)"
  by (induct set: tree_forest) simp_all


text 
  \medskip Theorems about size.


lemma size_map: "z \ tree_forest(A) \ size(map(h,z)) = size(z)"
  by (induct set: tree_forest) simp_all

lemma size_length: "z \ tree_forest(A) \ size(z) = length(preorder(z))"
  by (induct set: tree_forest) (simp_all add: length_app)

text 
  \medskip Theorems about preorder.


lemma preorder_map:
    "z \ tree_forest(A) \ preorder(map(h,z)) = List.map(h, preorder(z))"
  by (induct set: tree_forest) (simp_all add: map_app_distrib)

end

Messung V0.5
C=100 H=100 G=100

¤ Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.0.6Bemerkung:  ¤

*Bot Zugriff






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge