RTree.thy
author zhangx
Thu, 28 Jan 2016 21:14:17 +0800
changeset 90 ed938e2246b9
parent 80 17305a85493d
child 125 95e7933968f8
permissions -rw-r--r--
Retrofiting of: CpsG.thy (the parallel copy of PIPBasics.thy), ExtGG.thy (The paralell copy of Implemenation.thy), PrioG.thy (The paralell copy of Correctness.thy) has completed. The next step is to overwite original copies with the paralell ones.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
     1
theory RTree
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
     2
imports "~~/src/HOL/Library/Transitive_Closure_Table" Max
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
     3
begin
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
     4
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
     5
section {* A theory of relational trees *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
     6
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
     7
inductive_cases path_nilE [elim!]: "rtrancl_path r x [] y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
     8
inductive_cases path_consE [elim!]: "rtrancl_path r x (z#zs) y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
     9
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    10
subsection {* Definitions *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    11
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    12
text {*
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
    13
  In this theory, we are going to give a notion of of `Relational Graph` and
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    14
  its derived notion `Relational Tree`. Given a binary relation @{text "r"},
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    15
  the `Relational Graph of @{text "r"}` is the graph, the edges of which
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    16
  are those in @{text "r"}. In this way, any binary relation can be viewed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    17
  as a `Relational Graph`. Note, this notion of graph includes infinite graphs. 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    18
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    19
  A `Relation Graph` @{text "r"} is said to be a `Relational Tree` if it is both
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    20
  {\em single valued} and {\em acyclic}. 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    21
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    22
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    23
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    24
  The following @{text "sgv"} specifies that relation @{text "r"} is {\em single valued}.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    25
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    26
locale sgv = 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    27
  fixes r
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    28
  assumes sgv: "single_valued r"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    29
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    30
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    31
  The following @{text "rtree"} specifies that @{text "r"} is a 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    32
  {\em Relational Tree}.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    33
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    34
locale rtree = sgv + 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    35
  assumes acl: "acyclic r"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    36
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    37
text {* 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    38
  The following two auxiliary functions @{text "rel_of"} and @{text "pred_of"} 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    39
  transfer between the predicate and set representation of binary relations.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    40
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    41
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    42
definition "rel_of r = {(x, y) | x y. r x y}"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    43
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    44
definition "pred_of r = (\<lambda> x y. (x, y) \<in> r)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    45
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    46
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    47
  To reason about {\em Relational Graph}, a notion of path is 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    48
  needed, which is given by the following @{text "rpath"} (short 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    49
  for `relational path`). 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    50
  The path @{text "xs"} in proposition @{text "rpath r x xs y"} is 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    51
  a path leading from @{text "x"} to @{text "y"}, which serves as a 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    52
  witness of the fact @{text "(x, y) \<in> r^*"}. 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    53
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    54
  @{text "rpath"}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    55
  is simply a wrapper of the @{text "rtrancl_path"} defined in the imported 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    56
  theory @{text "Transitive_Closure_Table"}, which defines 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    57
  a notion of path for the predicate form of binary relations. 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    58
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    59
definition "rpath r x xs y = rtrancl_path (pred_of r) x xs y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    60
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    61
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    62
  Given a path @{text "ps"}, @{text "edges_on ps"} is the 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    63
  set of edges along the path, which is defined as follows:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    64
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    65
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    66
definition "edges_on ps = {(a,b) | a b. \<exists> xs ys. ps = xs@[a,b]@ys}"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    67
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    68
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    69
   The following @{text "indep"} defines a notion of independence. 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    70
   Two nodes @{text "x"} and @{text "y"} are said to be independent
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    71
   (expressed as @{text "indep x y"}),  if neither one is reachable 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    72
   from the other in relational graph @{text "r"}.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    73
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    74
definition "indep r x y = (((x, y) \<notin> r^*) \<and> ((y, x) \<notin> r^*))"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    75
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    76
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    77
  In relational tree @{text "r"}, the sub tree of node @{text "x"} is written
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    78
  @{text "subtree r x"}, which is defined to be the set of nodes (including itself) 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    79
  which can reach @{text "x"} by following some path in @{text "r"}:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    80
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    81
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    82
definition "subtree r x = {y . (y, x) \<in> r^*}"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    83
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
    84
definition "ancestors r x = {y. (x, y) \<in> r^+}"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
    85
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
    86
definition "root r x = (ancestors r x = {})"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
    87
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    88
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    89
  The following @{text "edge_in r x"} is the set of edges
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    90
  contained in the sub-tree of @{text "x"}, with @{text "r"} as the underlying graph.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    91
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    92
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    93
definition "edges_in r x = {(a, b) | a b. (a, b) \<in> r \<and> b \<in> subtree r x}"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    94
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    95
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    96
  The following lemma @{text "edges_in_meaning"} shows the intuitive meaning 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    97
  of `an edge @{text "(a, b)"} is in the sub-tree of @{text "x"}`, 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    98
  i.e., both @{text "a"} and @{text "b"} are in the sub-tree.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
    99
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   100
lemma edges_in_meaning: 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   101
  "edges_in r x = {(a, b) | a b. (a, b) \<in> r \<and> a \<in> subtree r x \<and> b \<in> subtree r x}"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   102
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   103
  { fix a b
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   104
    assume h: "(a, b) \<in> r" "b \<in> subtree r x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   105
    moreover have "a \<in> subtree r x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   106
    proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   107
      from h(2)[unfolded subtree_def] have "(b, x) \<in> r^*" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   108
      with h(1) have "(a, x) \<in> r^*" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   109
      thus ?thesis by (auto simp:subtree_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   110
    qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   111
    ultimately have "((a, b) \<in> r \<and> a \<in> subtree r x \<and> b \<in> subtree r x)" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   112
      by (auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   113
  } thus ?thesis by (auto simp:edges_in_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   114
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   115
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   116
text {*
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   117
  The following lemma shows the meaning of @{term "edges_in"} from the other side, 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   118
  which says: for the edge @{text "(a,b)"} to be outside of the sub-tree of @{text "x"}, 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   119
  it is sufficient to show that @{text "b"} is.
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   120
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   121
lemma edges_in_refutation:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   122
  assumes "b \<notin> subtree r x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   123
  shows "(a, b) \<notin> edges_in r x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   124
  using assms by (unfold edges_in_def subtree_def, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   125
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   126
definition "children r x = {y. (y, x) \<in> r}"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   127
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   128
locale fbranch =
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   129
  fixes r
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   130
  assumes fb: "\<forall> x \<in> Range r . finite (children r x)"
62
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   131
begin
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   132
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   133
lemma finite_children: "finite (children r x)"
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   134
proof(cases "children r x = {}")
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   135
  case True
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   136
  thus ?thesis by auto
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   137
next
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   138
  case False
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   139
  then obtain y where "(y, x) \<in> r" by (auto simp:children_def)
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   140
  hence "x \<in> Range r" by auto
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   141
  from fb[rule_format, OF this]
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   142
  show ?thesis .
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   143
qed
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   144
031d2ae9c9b8 In the middle of retrofiting ExtGG.thy.
zhangx
parents: 60
diff changeset
   145
end
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   146
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   147
locale fsubtree = fbranch + 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   148
   assumes wf: "wf r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   149
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   150
(* ccc *)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   151
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   152
subsection {* Auxiliary lemmas *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   153
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   154
lemma index_minimize:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   155
  assumes "P (i::nat)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   156
  obtains j where "P j" and "\<forall> k < j. \<not> P k" 
64
b4bcd1edbb6d renamed files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
   157
using assms
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   158
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   159
  have "\<exists> j. P j \<and> (\<forall> k < j. \<not> P k)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   160
  using assms
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   161
  proof(induct i rule:less_induct)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   162
    case (less t)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   163
    show ?case
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   164
    proof(cases "\<forall> j < t. \<not> P j")
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   165
      case True
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   166
      with less (2) show ?thesis by blast
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   167
    next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   168
      case False
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   169
      then obtain j where "j < t" "P j" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   170
      from less(1)[OF this]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   171
      show ?thesis .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   172
    qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   173
  qed 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   174
  with that show ?thesis by metis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   175
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   176
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   177
subsection {* Properties of Relational Graphs and Relational Trees *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   178
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   179
subsubsection {* Properties of @{text "rel_of"} and @{text "pred_of"} *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   180
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   181
text {* The following lemmas establish bijectivity of the two functions *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   182
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   183
lemma pred_rel_eq: "pred_of (rel_of r) = r" by (auto simp:rel_of_def pred_of_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   184
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   185
lemma rel_pred_eq: "rel_of (pred_of r) = r" by (auto simp:rel_of_def pred_of_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   186
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   187
lemma rel_of_star: "rel_of (r^**) = (rel_of r)^*"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   188
  by (unfold rel_of_def rtranclp_rtrancl_eq, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   189
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   190
lemma pred_of_star: "pred_of (r^*) = (pred_of r)^**"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   191
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   192
  { fix x y
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   193
    have "pred_of (r^*) x y = (pred_of r)^** x y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   194
    by (unfold pred_of_def rtranclp_rtrancl_eq, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   195
  } thus ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   196
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   197
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   198
lemma star_2_pstar: "(x, y) \<in> r^* = (pred_of (r^*)) x y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   199
  by (simp add: pred_of_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   200
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   201
subsubsection {* Properties of @{text "rpath"} *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   202
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   203
text {* Induction rule for @{text "rpath"}: *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   204
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   205
lemma rpath_induct [consumes 1, case_names rbase rstep, induct pred: rpath]:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   206
  assumes "rpath r x1 x2 x3"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   207
    and "\<And>x. P x [] x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   208
    and "\<And>x y ys z. (x, y) \<in> r \<Longrightarrow> rpath r y ys z \<Longrightarrow> P y ys z \<Longrightarrow> P x (y # ys) z"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   209
  shows "P x1 x2 x3"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   210
  using assms[unfolded rpath_def]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   211
  by (induct, auto simp:pred_of_def rpath_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   212
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   213
lemma rpathE: 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   214
  assumes "rpath r x xs y"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   215
  obtains (base) "y = x" "xs = []"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   216
     | (step) z zs where "(x, z) \<in> r" "rpath r z zs y" "xs = z#zs"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   217
  using assms
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   218
  by (induct, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   219
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   220
text {* Introduction rule for empty path *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   221
lemma rbaseI [intro!]: 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   222
  assumes "x = y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   223
  shows "rpath r x [] y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   224
  by  (unfold rpath_def assms, 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   225
         rule Transitive_Closure_Table.rtrancl_path.base)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   226
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   227
text {* Introduction rule for non-empty path *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   228
lemma rstepI [intro!]: 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   229
  assumes "(x, y) \<in> r"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   230
    and "rpath r y ys z"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   231
  shows "rpath r x (y#ys) z" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   232
proof(unfold rpath_def, rule Transitive_Closure_Table.rtrancl_path.step)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   233
  from assms(1) show "pred_of r x y" by (auto simp:pred_of_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   234
next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   235
  from assms(2) show "rtrancl_path (pred_of r) y ys z"  
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   236
  by (auto simp:pred_of_def rpath_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   237
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   238
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   239
text {* Introduction rule for @{text "@"}-path *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   240
lemma rpath_appendI [intro]: 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   241
  assumes "rpath r x xs a" and "rpath r a ys y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   242
  shows "rpath r x (xs @ ys) y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   243
  using assms 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   244
  by (unfold rpath_def, auto intro:rtrancl_path_trans)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   245
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   246
text {* Elimination rule for empty path *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   247
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   248
lemma rpath_cases [cases pred:rpath]:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   249
  assumes "rpath r a1 a2 a3"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   250
  obtains (rbase)  "a1 = a3" and "a2 = []"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   251
    | (rstep)  y :: "'a" and ys :: "'a list"  
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   252
         where "(a1, y) \<in> r" and "a2 = y # ys" and "rpath r y ys a3"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   253
  using assms [unfolded rpath_def]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   254
  by (cases, auto simp:rpath_def pred_of_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   255
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   256
lemma rpath_nilE [elim!, cases pred:rpath]: 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   257
  assumes "rpath r x [] y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   258
  obtains "y = x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   259
  using assms[unfolded rpath_def] by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   260
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   261
-- {* This is a auxiliary lemmas used only in the proof of @{text "rpath_nnl_lastE"} *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   262
lemma rpath_nnl_last:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   263
  assumes "rtrancl_path r x xs y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   264
  and "xs \<noteq> []"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   265
  obtains xs' where "xs = xs'@[y]"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   266
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   267
  from append_butlast_last_id[OF `xs \<noteq> []`, symmetric] 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   268
  obtain xs' y' where eq_xs: "xs = (xs' @ y' # [])" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   269
  with assms(1)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   270
  have "rtrancl_path r x ... y" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   271
  hence "y = y'" by (rule rtrancl_path_appendE, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   272
  with eq_xs have "xs = xs'@[y]" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   273
  from that[OF this] show ?thesis .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   274
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   275
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   276
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   277
  Elimination rule for non-empty paths constructed with @{text "#"}.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   278
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   279
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   280
lemma rpath_ConsE [elim!, cases pred:rpath]:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   281
  assumes "rpath r x (y # ys) x2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   282
  obtains (rstep) "(x, y) \<in> r" and "rpath r y ys x2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   283
  using assms[unfolded rpath_def]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   284
  by (cases, auto simp:rpath_def pred_of_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   285
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   286
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   287
  Elimination rule for non-empty path, where the destination node 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   288
  @{text "y"} is shown to be at the end of the path.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   289
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   290
lemma rpath_nnl_lastE: 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   291
  assumes "rpath r x xs y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   292
  and "xs \<noteq> []"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   293
  obtains xs' where "xs = xs'@[y]"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   294
  using assms[unfolded rpath_def]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   295
  by (rule rpath_nnl_last, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   296
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   297
text {* Other elimination rules of @{text "rpath"} *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   298
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   299
lemma rpath_appendE:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   300
  assumes "rpath r x (xs @ [a] @ ys) y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   301
  obtains "rpath r x (xs @ [a]) a" and "rpath r a ys y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   302
  using rtrancl_path_appendE[OF assms[unfolded rpath_def, simplified], folded rpath_def]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   303
  by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   304
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   305
lemma rpath_subE: 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   306
  assumes "rpath r x (xs @ [a] @ ys @ [b] @ zs) y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   307
  obtains "rpath r x (xs @ [a]) a" and "rpath r a (ys @ [b]) b" and "rpath r b zs y" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   308
  using assms
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   309
 by (elim rpath_appendE, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   310
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   311
text {* Every path has a unique end point. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   312
lemma rpath_dest_eq:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   313
  assumes "rpath r x xs x1"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   314
  and "rpath r x xs x2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   315
  shows "x1 = x2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   316
  using assms
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   317
  by (induct, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   318
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   319
subsubsection {* Properites of @{text "edges_on"} *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   320
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   321
lemma edges_on_unfold:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   322
  "edges_on (a # b # xs) = {(a, b)} \<union> edges_on (b # xs)" (is "?L = ?R")
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   323
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   324
  { fix c d
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   325
    assume "(c, d) \<in> ?L"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   326
    then obtain l1 l2 where h: "(a # b # xs) = l1 @ [c, d] @ l2" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   327
        by (auto simp:edges_on_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   328
    have "(c, d) \<in> ?R"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   329
    proof(cases "l1")
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   330
      case Nil
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   331
      with h have "(c, d) = (a, b)" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   332
      thus ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   333
    next
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   334
      case (Cons e es)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   335
      from h[unfolded this] have "b#xs = es@[c, d]@l2" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   336
      thus ?thesis by (auto simp:edges_on_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   337
    qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   338
  } moreover
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   339
  { fix c d
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   340
    assume "(c, d) \<in> ?R"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   341
    moreover have "(a, b) \<in> ?L" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   342
    proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   343
      have "(a # b # xs) = []@[a,b]@xs" by simp
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   344
      hence "\<exists> l1 l2. (a # b # xs) = l1@[a,b]@l2" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   345
      thus ?thesis by (unfold edges_on_def, simp)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   346
    qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   347
    moreover {
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   348
        assume "(c, d) \<in> edges_on (b#xs)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   349
        then obtain l1 l2 where "b#xs = l1@[c, d]@l2" by (unfold edges_on_def, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   350
        hence "a#b#xs = (a#l1)@[c,d]@l2" by simp
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   351
        hence "\<exists> l1 l2. (a # b # xs) = l1@[c,d]@l2" by metis
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   352
        hence "(c,d) \<in> ?L" by (unfold edges_on_def, simp)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   353
    }
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   354
    ultimately have "(c, d) \<in> ?L" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   355
  } ultimately show ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   356
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   357
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   358
lemma edges_on_len:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   359
  assumes "(a,b) \<in> edges_on l"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   360
  shows "length l \<ge> 2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   361
  using assms
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   362
  by (unfold edges_on_def, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   363
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   364
text {* Elimination of @{text "edges_on"} for non-empty path *}
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   365
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   366
lemma edges_on_consE [elim, cases set:edges_on]:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   367
  assumes "(a,b) \<in> edges_on (x#xs)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   368
  obtains (head)  xs' where "x = a" and "xs = b#xs'"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   369
      |  (tail)  "(a,b) \<in> edges_on xs"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   370
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   371
  from assms obtain l1 l2 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   372
  where h: "(x#xs) = l1 @ [a,b] @ l2" by (unfold edges_on_def, blast)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   373
  have "(\<exists> xs'. x = a \<and> xs = b#xs') \<or> ((a,b) \<in> edges_on xs)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   374
  proof(cases "l1")
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   375
    case Nil with h 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   376
    show ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   377
  next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   378
    case (Cons e el)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   379
    from h[unfolded this] 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   380
    have "xs = el @ [a,b] @ l2" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   381
    thus ?thesis 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   382
      by (unfold edges_on_def, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   383
  qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   384
  thus ?thesis 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   385
  proof
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   386
    assume "(\<exists>xs'. x = a \<and> xs = b # xs')"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   387
    then obtain xs' where "x = a" "xs = b#xs'" by blast
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   388
    from that(1)[OF this] show ?thesis .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   389
  next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   390
    assume "(a, b) \<in> edges_on xs"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   391
    from that(2)[OF this] show ?thesis .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   392
  qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   393
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   394
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   395
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   396
  Every edges on the path is a graph edges:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   397
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   398
lemma rpath_edges_on:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   399
  assumes "rpath r x xs y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   400
  shows "(edges_on (x#xs)) \<subseteq> r"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   401
  using assms
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   402
proof(induct arbitrary:y)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   403
  case (rbase x)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   404
  thus ?case by (unfold edges_on_def, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   405
next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   406
  case (rstep x y ys z)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   407
  show ?case
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   408
  proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   409
    { fix a b
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   410
      assume "(a, b) \<in> edges_on (x # y # ys)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   411
      hence "(a, b) \<in> r" by (cases, insert rstep, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   412
    } thus ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   413
  qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   414
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   415
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   416
text {* @{text "edges_on"} is mono with respect to @{text "#"}-operation: *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   417
lemma edges_on_Cons_mono:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   418
   shows "edges_on xs \<subseteq> edges_on (x#xs)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   419
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   420
  { fix a b
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   421
    assume "(a, b) \<in> edges_on xs"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   422
    then obtain l1 l2 where "xs = l1 @ [a,b] @ l2" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   423
      by (auto simp:edges_on_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   424
    hence "x # xs = (x#l1) @ [a, b] @ l2" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   425
    hence "(a, b) \<in> edges_on (x#xs)" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   426
      by (unfold edges_on_def, blast)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   427
  } thus ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   428
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   429
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   430
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   431
  The following rule @{text "rpath_transfer"} is used to show 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   432
  that one path is intact as long as all the edges on it are intact
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   433
  with the change of graph.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   434
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   435
  If @{text "x#xs"} is path in graph @{text "r1"} and 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   436
  every edges along the path is also in @{text "r2"}, 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   437
  then @{text "x#xs"} is also a edge in graph @{text "r2"}:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   438
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   439
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   440
lemma rpath_transfer:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   441
  assumes "rpath r1 x xs y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   442
  and "edges_on (x#xs) \<subseteq> r2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   443
  shows "rpath r2 x xs y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   444
  using assms
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   445
proof(induct)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   446
  case (rstep x y ys z)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   447
  show ?case 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   448
  proof(rule rstepI)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   449
    show "(x, y) \<in> r2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   450
    proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   451
      have "(x, y) \<in> edges_on  (x # y # ys)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   452
          by (unfold edges_on_def, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   453
     with rstep(4) show ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   454
    qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   455
  next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   456
    show "rpath r2 y ys z" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   457
     using rstep edges_on_Cons_mono[of "y#ys" "x"] by (auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   458
  qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   459
qed (unfold rpath_def, auto intro!:Transitive_Closure_Table.rtrancl_path.base)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   460
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   461
lemma edges_on_rpathI:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   462
  assumes "edges_on (a#xs@[b]) \<subseteq> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   463
  shows "rpath r a (xs@[b]) b"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   464
  using assms
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   465
proof(induct xs arbitrary: a b)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   466
  case Nil
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   467
  moreover have "(a, b) \<in> edges_on (a # [] @ [b])"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   468
      by (unfold edges_on_def, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   469
  ultimately have "(a, b) \<in> r" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   470
  thus ?case by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   471
next
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   472
  case (Cons x xs a b)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   473
  from this(2) have "edges_on (x # xs @ [b]) \<subseteq> r" by (simp add:edges_on_unfold)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   474
  from Cons(1)[OF this] have " rpath r x (xs @ [b]) b" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   475
  moreover from Cons(2) have "(a, x) \<in> r" by (auto simp:edges_on_unfold)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   476
  ultimately show ?case by (auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   477
qed
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   478
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   479
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   480
  The following lemma extracts the path from @{text "x"} to @{text "y"}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   481
  from proposition @{text "(x, y) \<in> r^*"}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   482
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   483
lemma star_rpath:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   484
  assumes "(x, y) \<in> r^*"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   485
  obtains xs where "rpath r x xs y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   486
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   487
  have "\<exists> xs. rpath r x xs y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   488
  proof(unfold rpath_def, rule iffD1[OF rtranclp_eq_rtrancl_path])
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   489
    from assms
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   490
    show "(pred_of r)\<^sup>*\<^sup>* x y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   491
      apply (fold pred_of_star)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   492
      by (auto simp:pred_of_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   493
  qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   494
  from that and this show ?thesis by blast
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   495
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   496
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   497
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   498
  The following lemma uses the path @{text "xs"} from @{text "x"} to @{text "y"}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   499
  as a witness to show @{text "(x, y) \<in> r^*"}.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   500
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   501
lemma rpath_star: 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   502
  assumes "rpath r x xs y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   503
  shows "(x, y) \<in> r^*"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   504
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   505
  from iffD2[OF rtranclp_eq_rtrancl_path] and assms[unfolded rpath_def]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   506
  have "(pred_of r)\<^sup>*\<^sup>* x y" by metis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   507
  thus ?thesis by (simp add: pred_of_star star_2_pstar)
60
f98a95f3deae Main proofs in CpsG.thy completed.
zhangx
parents: 58
diff changeset
   508
qed  
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   509
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   510
lemma subtree_transfer:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   511
  assumes "a \<in> subtree r1 a'"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   512
  and "r1 \<subseteq> r2"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   513
  shows "a \<in> subtree r2 a'"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   514
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   515
  from assms(1)[unfolded subtree_def] 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   516
  have "(a, a') \<in> r1^*" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   517
  from star_rpath[OF this]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   518
  obtain xs where rp: "rpath r1 a xs a'" by blast
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   519
  hence "rpath r2 a xs a'"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   520
  proof(rule rpath_transfer)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   521
    from rpath_edges_on[OF rp] and assms(2)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   522
    show "edges_on (a # xs) \<subseteq> r2" by simp
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   523
  qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   524
  from rpath_star[OF this]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   525
  show ?thesis by (auto simp:subtree_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   526
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   527
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   528
lemma subtree_rev_transfer:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   529
  assumes "a \<notin> subtree r2 a'"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   530
  and "r1 \<subseteq> r2"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   531
  shows "a \<notin> subtree r1 a'"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   532
  using assms and subtree_transfer by metis
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   533
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   534
text {*
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   535
  The following lemmas establishes a relation from paths in @{text "r"}
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   536
  to @{text "r^+"} relation.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   537
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   538
lemma rpath_plus: 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   539
  assumes "rpath r x xs y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   540
  and "xs \<noteq> []"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   541
  shows "(x, y) \<in> r^+"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   542
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   543
  from assms(2) obtain e es where "xs = e#es" by (cases xs, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   544
  from assms(1)[unfolded this]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   545
  show ?thesis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   546
  proof(cases)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   547
    case rstep
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   548
    show ?thesis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   549
    proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   550
      from rpath_star[OF rstep(2)] have "(e, y) \<in> r\<^sup>*" .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   551
      with rstep(1) show "(x, y) \<in> r^+" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   552
    qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   553
  qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   554
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   555
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   556
lemma plus_rpath: 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   557
  assumes "(x, y) \<in> r^+"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   558
  obtains xs where "rpath r x xs y" and "xs \<noteq> []"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   559
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   560
  from assms
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   561
  show ?thesis
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   562
  proof(cases rule:converse_tranclE[consumes 1])
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   563
    case 1
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   564
    hence "rpath r x [y] y" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   565
    from that[OF this] show ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   566
  next
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   567
    case (2 z)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   568
    from 2(2) have "(z, y) \<in> r^*" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   569
    from star_rpath[OF this] obtain xs where "rpath r z xs y" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   570
    from rstepI[OF 2(1) this]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   571
    have "rpath r x (z # xs) y" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   572
    from that[OF this] show ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   573
  qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   574
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   575
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   576
subsubsection {* Properties of @{text "subtree"} and @{term "ancestors"}*}
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   577
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   578
lemma ancestors_subtreeI:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   579
  assumes "b \<in> ancestors r a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   580
  shows "a \<in> subtree r b"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   581
  using assms by (auto simp:subtree_def ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   582
60
f98a95f3deae Main proofs in CpsG.thy completed.
zhangx
parents: 58
diff changeset
   583
lemma ancestors_Field:
f98a95f3deae Main proofs in CpsG.thy completed.
zhangx
parents: 58
diff changeset
   584
  assumes "b \<in> ancestors r a"
f98a95f3deae Main proofs in CpsG.thy completed.
zhangx
parents: 58
diff changeset
   585
  obtains "a \<in> Domain r" "b \<in> Range r"
f98a95f3deae Main proofs in CpsG.thy completed.
zhangx
parents: 58
diff changeset
   586
  using assms 
f98a95f3deae Main proofs in CpsG.thy completed.
zhangx
parents: 58
diff changeset
   587
  apply (unfold ancestors_def, simp)
f98a95f3deae Main proofs in CpsG.thy completed.
zhangx
parents: 58
diff changeset
   588
  by (metis Domain.DomainI Range.intros trancl_domain trancl_range)
f98a95f3deae Main proofs in CpsG.thy completed.
zhangx
parents: 58
diff changeset
   589
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   590
lemma subtreeE:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   591
  assumes "a \<in> subtree r b"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   592
  obtains "a = b"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   593
      | "a \<noteq> b" and "b \<in> ancestors r a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   594
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   595
  from assms have "(a, b) \<in> r^*" by (auto simp:subtree_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   596
  from rtranclD[OF this]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   597
  have " a = b \<or> a \<noteq> b \<and> (a, b) \<in> r\<^sup>+" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   598
  with that[unfolded ancestors_def] show ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   599
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   600
63
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   601
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   602
lemma subtree_Field:
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   603
  "subtree r x \<subseteq> Field r \<union> {x}"
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   604
proof
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   605
  fix y
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   606
  assume "y \<in> subtree r x"
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   607
  thus "y \<in> Field r \<union> {x}"
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   608
  proof(cases rule:subtreeE)
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   609
    case 1
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   610
    thus ?thesis by auto
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   611
  next
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   612
    case 2
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   613
    thus ?thesis apply (auto simp:ancestors_def)
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   614
    using Field_def tranclD by fastforce 
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   615
  qed
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   616
qed
b620a2a0806a ExtGG.thy finished, but more comments are needed.
zhangx
parents: 62
diff changeset
   617
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   618
lemma subtree_ancestorsI:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   619
  assumes "a \<in> subtree r b"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   620
  and "a \<noteq> b"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   621
  shows "b \<in> ancestors r a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   622
  using assms
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   623
  by (auto elim!:subtreeE)
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   624
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   625
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   626
  @{text "subtree"} is mono with respect to the underlying graph.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   627
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   628
lemma subtree_mono:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   629
  assumes "r1 \<subseteq> r2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   630
  shows "subtree r1 x \<subseteq> subtree r2 x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   631
proof
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   632
  fix c
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   633
  assume "c \<in> subtree r1 x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   634
  hence "(c, x) \<in> r1^*" by (auto simp:subtree_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   635
  from star_rpath[OF this] obtain xs 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   636
  where rp:"rpath r1 c xs x" by metis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   637
  hence "rpath r2 c xs x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   638
  proof(rule rpath_transfer)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   639
    from rpath_edges_on[OF rp] have "edges_on (c # xs) \<subseteq> r1" .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   640
    with assms show "edges_on (c # xs) \<subseteq> r2" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   641
  qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   642
  thus "c \<in> subtree r2 x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   643
    by (rule rpath_star[elim_format], auto simp:subtree_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   644
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   645
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   646
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   647
  The following lemma characterizes the change of sub-tree of @{text "x"}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   648
  with the removal of an outside edge @{text "(a,b)"}. 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   649
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   650
  Note that, according to lemma @{thm edges_in_refutation}, the assumption
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   651
  @{term "b \<notin> subtree r x"} amounts to saying @{text "(a, b)"} 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   652
  is outside the sub-tree of @{text "x"}.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   653
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   654
lemma subtree_del_outside: (* ddd *)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   655
    assumes "b \<notin> subtree r x" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   656
    shows "subtree (r - {(a, b)}) x = (subtree r x)" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   657
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   658
  { fix c
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   659
    assume "c \<in> (subtree r x)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   660
    hence "(c, x) \<in> r^*" by (auto simp:subtree_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   661
    hence "c \<in> subtree (r - {(a, b)}) x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   662
    proof(rule star_rpath)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   663
      fix xs
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   664
      assume rp: "rpath r c xs x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   665
      show ?thesis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   666
      proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   667
        from rp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   668
        have "rpath  (r - {(a, b)}) c xs x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   669
        proof(rule rpath_transfer)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   670
          from rpath_edges_on[OF rp] have "edges_on (c # xs) \<subseteq> r" .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   671
          moreover have "(a, b) \<notin> edges_on (c#xs)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   672
          proof
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   673
            assume "(a, b) \<in> edges_on (c # xs)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   674
            then obtain l1 l2 where h: "c#xs = l1@[a,b]@l2" by (auto simp:edges_on_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   675
            hence "tl (c#xs) = tl (l1@[a,b]@l2)" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   676
            then obtain l1' where eq_xs_b: "xs = l1'@[b]@l2" by (cases l1, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   677
            from rp[unfolded this]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   678
            show False
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   679
            proof(rule rpath_appendE)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   680
              assume "rpath r b l2 x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   681
              thus ?thesis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   682
              by(rule rpath_star[elim_format], insert assms(1), auto simp:subtree_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   683
            qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   684
          qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   685
          ultimately show "edges_on (c # xs) \<subseteq> r - {(a,b)}" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   686
        qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   687
        thus ?thesis by (rule rpath_star[elim_format], auto simp:subtree_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   688
      qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   689
    qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   690
  } moreover {
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   691
    fix c
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   692
    assume "c \<in> subtree (r - {(a, b)}) x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   693
    moreover have "... \<subseteq> (subtree r x)" by (rule subtree_mono, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   694
    ultimately have "c \<in> (subtree r x)" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   695
  } ultimately show ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   696
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   697
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   698
(* ddd *)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   699
lemma subset_del_subtree_outside: (* ddd *)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   700
    assumes "Range r' \<inter> subtree r x = {}" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   701
    shows "subtree (r - r') x = (subtree r x)" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   702
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   703
  { fix c
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   704
    assume "c \<in> (subtree r x)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   705
    hence "(c, x) \<in> r^*" by (auto simp:subtree_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   706
    hence "c \<in> subtree (r - r') x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   707
    proof(rule star_rpath)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   708
      fix xs
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   709
      assume rp: "rpath r c xs x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   710
      show ?thesis
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   711
      proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   712
        from rp
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   713
        have "rpath  (r - r') c xs x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   714
        proof(rule rpath_transfer)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   715
          from rpath_edges_on[OF rp] have "edges_on (c # xs) \<subseteq> r" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   716
          moreover {
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   717
              fix a b
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   718
              assume h: "(a, b) \<in> r'"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   719
              have "(a, b) \<notin> edges_on (c#xs)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   720
              proof
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   721
                assume "(a, b) \<in> edges_on (c # xs)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   722
                then obtain l1 l2 where "c#xs = (l1@[a])@[b]@l2" by (auto simp:edges_on_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   723
                hence "tl (c#xs) = tl (l1@[a,b]@l2)" by simp
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   724
                then obtain l1' where eq_xs_b: "xs = l1'@[b]@l2" by (cases l1, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   725
                from rp[unfolded this]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   726
                show False
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   727
                proof(rule rpath_appendE)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   728
                  assume "rpath r b l2 x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   729
                  from rpath_star[OF this]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   730
                  have "b \<in> subtree r x" by (auto simp:subtree_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   731
                  with assms (1) and h show ?thesis by (auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   732
                qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   733
             qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   734
         } ultimately show "edges_on (c # xs) \<subseteq> r - r'" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   735
        qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   736
        thus ?thesis by (rule rpath_star[elim_format], auto simp:subtree_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   737
      qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   738
    qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   739
  } moreover {
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   740
    fix c
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   741
    assume "c \<in> subtree (r - r') x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   742
    moreover have "... \<subseteq> (subtree r x)" by (rule subtree_mono, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   743
    ultimately have "c \<in> (subtree r x)" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   744
  } ultimately show ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   745
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   746
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   747
lemma subtree_insert_ext:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   748
    assumes "b \<in> subtree r x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   749
    shows "subtree (r \<union> {(a, b)}) x = (subtree r x) \<union> (subtree r a)" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   750
    using assms by (auto simp:subtree_def rtrancl_insert)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   751
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   752
lemma subtree_insert_next:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   753
    assumes "b \<notin> subtree r x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   754
    shows "subtree (r \<union> {(a, b)}) x = (subtree r x)" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   755
    using assms
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   756
    by (auto simp:subtree_def rtrancl_insert)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   757
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   758
lemma set_add_rootI:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   759
  assumes "root r a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   760
  and "a \<notin> Domain r1"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   761
  shows "root (r \<union> r1) a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   762
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   763
  let ?r = "r \<union> r1"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   764
  { fix a'
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   765
    assume "a' \<in> ancestors ?r a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   766
    hence "(a, a') \<in> ?r^+" by (auto simp:ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   767
    from tranclD[OF this] obtain z where "(a, z) \<in> ?r" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   768
    moreover have "(a, z) \<notin> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   769
    proof
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   770
      assume "(a, z) \<in> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   771
      with assms(1) show False 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   772
        by (auto simp:root_def ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   773
    qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   774
    ultimately have "(a, z) \<in> r1" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   775
    with assms(2) 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   776
    have False by (auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   777
  } thus ?thesis by (auto simp:root_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   778
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   779
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   780
lemma ancestors_mono:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   781
  assumes "r1 \<subseteq> r2"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   782
  shows "ancestors r1 x \<subseteq> ancestors r2 x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   783
proof
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   784
 fix a
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   785
 assume "a \<in> ancestors r1 x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   786
 hence "(x, a) \<in> r1^+" by (auto simp:ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   787
 from plus_rpath[OF this] obtain xs where 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   788
    h: "rpath r1 x xs a" "xs \<noteq> []" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   789
 have "rpath r2 x xs a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   790
 proof(rule rpath_transfer[OF h(1)])
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   791
  from rpath_edges_on[OF h(1)] and assms
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   792
  show "edges_on (x # xs) \<subseteq> r2" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   793
 qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   794
 from rpath_plus[OF this h(2)]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   795
 show "a \<in> ancestors r2 x" by (auto simp:ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   796
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   797
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   798
lemma subtree_refute:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   799
  assumes "x \<notin> ancestors r y"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   800
  and "x \<noteq> y"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   801
  shows "y \<notin> subtree r x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   802
proof
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   803
   assume "y \<in> subtree r x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   804
   thus False
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   805
     by(elim subtreeE, insert assms, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   806
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   807
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   808
subsubsection {* Properties about relational trees *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   809
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   810
context rtree 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   811
begin
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   812
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   813
lemma ancestors_headE:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   814
  assumes "c \<in> ancestors r a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   815
  assumes "(a, b) \<in> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   816
  obtains "b = c"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   817
     |   "c \<in> ancestors r b"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   818
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   819
  from assms(1) 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   820
  have "(a, c) \<in> r^+" by (auto simp:ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   821
  hence "b = c \<or> c \<in> ancestors r b"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   822
  proof(cases rule:converse_tranclE[consumes 1])
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   823
    case 1
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   824
    with assms(2) and sgv have "b = c" by (auto simp:single_valued_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   825
    thus ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   826
  next
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   827
    case (2 y)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   828
    from 2(1) and assms(2) and sgv have "y = b" by (auto simp:single_valued_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   829
    from 2(2)[unfolded this] have "c \<in> ancestors r b" by (auto simp:ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   830
    thus ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   831
  qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   832
  with that show ?thesis by metis
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   833
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   834
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   835
lemma ancestors_accum:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   836
  assumes "(a, b) \<in> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   837
  shows "ancestors r a = ancestors r b \<union> {b}"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   838
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   839
  { fix c
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   840
    assume "c \<in> ancestors r a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   841
    hence "(a, c) \<in> r^+" by (auto simp:ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   842
    hence "c \<in> ancestors r b \<union> {b}"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   843
    proof(cases rule:converse_tranclE[consumes 1])
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   844
      case 1
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   845
      with sgv assms have "c = b" by (unfold single_valued_def, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   846
      thus ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   847
    next
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   848
      case (2 c')
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   849
      with sgv assms have "c' = b" by (unfold single_valued_def, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   850
      from 2(2)[unfolded this]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   851
      show ?thesis by (auto simp:ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   852
    qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   853
  } moreover {
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   854
    fix c
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   855
    assume "c \<in> ancestors r b \<union> {b}"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   856
    hence "c = b \<or> c \<in> ancestors r b" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   857
    hence "c \<in> ancestors r a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   858
    proof
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   859
      assume "c = b"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   860
      from assms[folded this] 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   861
      show ?thesis by (auto simp:ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   862
    next
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   863
      assume "c \<in> ancestors r b"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   864
      with assms show ?thesis by (auto simp:ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   865
    qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   866
  } ultimately show ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   867
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   868
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   869
lemma rootI:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   870
  assumes h: "\<And> x'. x' \<noteq> x \<Longrightarrow> x \<notin> subtree r' x'"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   871
  and "r' \<subseteq> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   872
  shows "root r' x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   873
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   874
  from acyclic_subset[OF acl assms(2)]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   875
  have acl': "acyclic r'" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   876
  { fix x'
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   877
    assume "x' \<in> ancestors r' x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   878
    hence h1: "(x, x') \<in> r'^+" by (auto simp:ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   879
    have "x' \<noteq> x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   880
    proof
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   881
      assume eq_x: "x' = x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   882
      from h1[unfolded this] and acl'
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   883
      show False by (auto simp:acyclic_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   884
    qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   885
    moreover from h1 have "x \<in> subtree r' x'" by (auto simp:subtree_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   886
    ultimately have False using h by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   887
  } thus ?thesis by (auto simp:root_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   888
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
   889
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   890
lemma rpath_overlap_oneside: (* ddd *)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   891
  assumes "rpath r x xs1 x1"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   892
  and "rpath r x xs2 x2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   893
  and "length xs1 \<le> length xs2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   894
  obtains xs3 where "xs2 = xs1 @ xs3"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   895
proof(cases "xs1 = []")
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   896
  case True
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   897
  with that show ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   898
next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   899
  case False
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   900
  have "\<forall> i \<le> length xs1. take i xs1 = take i xs2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   901
  proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   902
     { assume "\<not> (\<forall> i \<le> length xs1. take i xs1 = take i xs2)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   903
       then obtain i where "i \<le> length xs1 \<and> take i xs1 \<noteq> take i xs2" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   904
       from this(1) have "False"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   905
       proof(rule index_minimize)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   906
          fix j
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   907
          assume h1: "j \<le> length xs1 \<and> take j xs1 \<noteq> take j xs2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   908
          and h2: " \<forall>k<j. \<not> (k \<le> length xs1 \<and> take k xs1 \<noteq> take k xs2)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   909
          -- {* @{text "j - 1"} is the branch point between @{text "xs1"} and @{text "xs2"} *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   910
          let ?idx = "j - 1"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   911
          -- {* A number of inequalities concerning @{text "j - 1"} are derived first *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   912
          have lt_i: "?idx < length xs1" using False h1 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   913
            by (metis Suc_diff_1 le_neq_implies_less length_greater_0_conv lessI less_imp_diff_less)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   914
          have lt_i': "?idx < length xs2" using lt_i and assms(3) by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   915
          have lt_j: "?idx < j" using h1 by (cases j, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   916
          -- {* From thesis inequalities, a number of equations concerning @{text "xs1"}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   917
                 and @{text "xs2"} are derived *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   918
          have eq_take: "take ?idx xs1 = take ?idx xs2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   919
            using h2[rule_format, OF lt_j] and h1 by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   920
          have eq_xs1: " xs1 = take ?idx xs1 @ xs1 ! (?idx) # drop (Suc (?idx)) xs1" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   921
            using id_take_nth_drop[OF lt_i] .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   922
          have eq_xs2: "xs2 = take ?idx xs2 @ xs2 ! (?idx) # drop (Suc (?idx)) xs2" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   923
              using id_take_nth_drop[OF lt_i'] .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   924
          -- {* The branch point along the path is finally pinpointed *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   925
          have neq_idx: "xs1!?idx \<noteq> xs2!?idx" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   926
          proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   927
            have "take j xs1 = take ?idx xs1 @ [xs1 ! ?idx]"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   928
                using eq_xs1 Suc_diff_1 lt_i lt_j take_Suc_conv_app_nth by fastforce 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   929
            moreover have eq_tk2: "take j xs2 = take ?idx xs2 @ [xs2 ! ?idx]"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   930
                using Suc_diff_1 lt_i' lt_j take_Suc_conv_app_nth by fastforce 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   931
            ultimately show ?thesis using eq_take h1 by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   932
          qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   933
          show ?thesis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   934
          proof(cases " take (j - 1) xs1 = []")
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   935
            case True
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   936
            have "(x, xs1!?idx) \<in> r"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   937
            proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   938
                from eq_xs1[unfolded True, simplified, symmetric] assms(1) 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   939
                have "rpath r x ( xs1 ! ?idx # drop (Suc ?idx) xs1) x1" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   940
                from this[unfolded rpath_def]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   941
                show ?thesis by (auto simp:pred_of_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   942
            qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   943
            moreover have "(x, xs2!?idx) \<in> r"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   944
            proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   945
              from eq_xs2[folded eq_take, unfolded True, simplified, symmetric] assms(2)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   946
              have "rpath r x ( xs2 ! ?idx # drop (Suc ?idx) xs2) x2" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   947
              from this[unfolded rpath_def]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   948
              show ?thesis by (auto simp:pred_of_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   949
            qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   950
            ultimately show ?thesis using neq_idx sgv[unfolded single_valued_def] by metis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   951
        next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   952
           case False
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   953
           then obtain e es where eq_es: "take ?idx xs1 = es@[e]" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   954
            using rev_exhaust by blast 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   955
           have "(e, xs1!?idx) \<in> r"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   956
           proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   957
            from eq_xs1[unfolded eq_es] 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   958
            have "xs1 = es@[e, xs1!?idx]@drop (Suc ?idx) xs1" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   959
            hence "(e, xs1!?idx) \<in> edges_on xs1" by (simp add:edges_on_def, metis)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   960
            with rpath_edges_on[OF assms(1)] edges_on_Cons_mono[of xs1 x]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   961
            show ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   962
           qed moreover have "(e, xs2!?idx) \<in> r"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   963
           proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   964
            from eq_xs2[folded eq_take, unfolded eq_es]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   965
            have "xs2 = es@[e, xs2!?idx]@drop (Suc ?idx) xs2" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   966
            hence "(e, xs2!?idx) \<in> edges_on xs2" by (simp add:edges_on_def, metis)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   967
            with rpath_edges_on[OF assms(2)] edges_on_Cons_mono[of xs2 x]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   968
            show ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   969
           qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   970
           ultimately show ?thesis 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   971
              using sgv[unfolded single_valued_def] neq_idx by metis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   972
        qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   973
       qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   974
     } thus ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   975
  qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   976
  from this[rule_format, of "length xs1"]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   977
  have "take (length xs1) xs1 = take (length xs1) xs2" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   978
  moreover have "xs2 = take (length xs1) xs2 @ drop (length xs1) xs2" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   979
  ultimately have "xs2 = xs1 @ drop (length xs1) xs2" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   980
  from that[OF this] show ?thesis .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   981
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
   982
80
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   983
lemma rpath_overlap_oneside':
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   984
  assumes "rpath r x xs1 x1" 
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   985
  and "rpath r x xs2 x2"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   986
  and "length xs1 \<le> length xs2"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   987
  obtains xs3 where 
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   988
    "xs2 = xs1 @ xs3" "rpath r x xs1 x1" "rpath r x1 xs3 x2"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   989
proof -
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   990
  from rpath_overlap_oneside[OF assms]
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   991
  obtain xs3 where eq_xs: "xs2 = xs1 @ xs3" by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   992
  show ?thesis
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   993
  proof(cases "xs1 = []")
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   994
    case True
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   995
    from rpath_nilE[OF assms(1)[unfolded this]]
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   996
    have eq_x1: "x1 = x" .
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   997
    have "xs2 = xs3" using True eq_xs by simp
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   998
    from that[OF eq_xs assms(1) assms(2)[folded eq_x1, unfolded this]]
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
   999
    show ?thesis .
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1000
  next
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1001
    case False  
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1002
    from rpath_nnl_lastE[OF assms(1) False]
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1003
    obtain xs' where eq_xs1: "xs1 = xs'@[x1]" by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1004
    from assms(2)[unfolded eq_xs this]
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1005
    have "rpath r x (xs' @ [x1] @ xs3) x2" by simp
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1006
    from rpath_appendE[OF this]
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1007
    have "rpath r x (xs' @ [x1]) x1" "rpath r x1 xs3 x2" by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1008
    from that [OF eq_xs this(1)[folded eq_xs1] this(2)]
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1009
    show ?thesis .
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1010
  qed
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1011
qed
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1012
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1013
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1014
lemma rpath_overlap [consumes 2, cases pred:rpath]:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1015
  assumes "rpath r x xs1 x1"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1016
  and "rpath r x xs2 x2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1017
  obtains (less_1) xs3 where "xs2 = xs1 @ xs3"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1018
     |    (less_2) xs3 where "xs1 = xs2 @ xs3"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1019
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1020
  have "length xs1 \<le> length xs2 \<or> length xs2 \<le> length xs1" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1021
  with assms rpath_overlap_oneside that show ?thesis by metis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1022
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1023
80
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1024
lemma rpath_overlap' [consumes 2, cases pred:rpath]:
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1025
  assumes "rpath r x xs1 x1"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1026
  and "rpath r x xs2 x2"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1027
  obtains (less_1) xs3 where "xs2 = xs1 @ xs3" "rpath r x xs1 x1" "rpath r x1 xs3 x2"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1028
     |    (less_2) xs3 where "xs1 = xs2 @ xs3" "rpath r x xs2 x2" "rpath r x2 xs3 x1"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1029
proof -
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1030
  have "length xs1 \<le> length xs2 \<or> length xs2 \<le> length xs1" by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1031
  with assms rpath_overlap_oneside' that show ?thesis by metis
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1032
qed
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1033
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1034
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1035
  As a corollary of @{thm "rpath_overlap_oneside"}, 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1036
  the following two lemmas gives one important property of relation tree, 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1037
  i.e. there is at most one path between any two nodes.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1038
  Similar to the proof of @{thm rpath_overlap}, we starts with
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1039
  the one side version first.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1040
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1041
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1042
lemma rpath_unique_oneside:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1043
  assumes "rpath r x xs1 y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1044
    and "rpath r x xs2 y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1045
    and "length xs1 \<le> length xs2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1046
  shows "xs1 = xs2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1047
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1048
  from rpath_overlap_oneside[OF assms] 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1049
  obtain xs3 where less_1: "xs2 = xs1 @ xs3" by blast
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1050
  show ?thesis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1051
  proof(cases "xs3 = []") 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1052
    case True
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1053
    from less_1[unfolded this] show ?thesis by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1054
  next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1055
    case False
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1056
    note FalseH = this
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1057
    show ?thesis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1058
    proof(cases "xs1 = []")
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1059
      case True
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1060
      have "(x, x) \<in> r^+"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1061
      proof(rule rpath_plus)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1062
        from assms(1)[unfolded True] 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1063
        have "y = x" by (cases rule:rpath_nilE, simp)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1064
        from assms(2)[unfolded this] show "rpath r x xs2 x" .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1065
      next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1066
        from less_1 and False show "xs2 \<noteq> []" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1067
      qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1068
      with acl show ?thesis by (unfold acyclic_def, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1069
    next 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1070
      case False
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1071
      then obtain e es where eq_xs1: "xs1 = es@[e]" using rev_exhaust by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1072
      from assms(2)[unfolded less_1 this]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1073
      have "rpath r x (es @ [e] @ xs3) y" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1074
      thus ?thesis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1075
      proof(cases rule:rpath_appendE)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1076
        case 1
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1077
        from rpath_dest_eq [OF 1(1)[folded eq_xs1] assms(1)]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1078
        have "e = y" .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1079
        from rpath_plus [OF 1(2)[unfolded this] FalseH]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1080
        have "(y, y) \<in> r^+" .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1081
        with acl show ?thesis by (unfold acyclic_def, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1082
      qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1083
    qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1084
  qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1085
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1086
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1087
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1088
  The following is the full version of path uniqueness.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1089
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1090
lemma rpath_unique:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1091
  assumes "rpath r x xs1 y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1092
    and "rpath r x xs2 y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1093
  shows "xs1 = xs2"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1094
proof(cases "length xs1 \<le> length xs2")
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1095
   case True
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1096
   from rpath_unique_oneside[OF assms this] show ?thesis .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1097
next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1098
  case False
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1099
  hence "length xs2 \<le> length xs1" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1100
  from rpath_unique_oneside[OF assms(2,1) this]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1101
  show ?thesis by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1102
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1103
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1104
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1105
  The following lemma shows that the `independence` relation is symmetric.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1106
  It is an obvious auxiliary lemma which will be used later. 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1107
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1108
lemma sym_indep: "indep r x y \<Longrightarrow> indep r y x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1109
  by (unfold indep_def, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1110
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1111
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1112
  This is another `obvious` lemma about trees, which says trees rooted at 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1113
  independent nodes are disjoint.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1114
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1115
lemma subtree_disjoint:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1116
  assumes "indep r x y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1117
  shows "subtree r x \<inter> subtree r y = {}"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1118
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1119
  { fix z x y xs1 xs2 xs3
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1120
      assume ind: "indep r x y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1121
      and rp1: "rpath r z xs1 x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1122
      and rp2: "rpath r z xs2 y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1123
      and h: "xs2 = xs1 @ xs3"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1124
      have False
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1125
      proof(cases "xs1 = []")
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1126
        case True
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1127
        from rp1[unfolded this] have "x = z" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1128
        from rp2[folded this] rpath_star ind[unfolded indep_def]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1129
        show ?thesis by metis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1130
      next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1131
        case False
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1132
        then obtain e es where eq_xs1: "xs1 = es@[e]" using rev_exhaust by blast
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1133
        from rp2[unfolded h this]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1134
        have "rpath r z (es @ [e] @ xs3) y" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1135
        thus ?thesis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1136
        proof(cases rule:rpath_appendE)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1137
          case 1
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1138
          have "e = x" using 1(1)[folded eq_xs1] rp1 rpath_dest_eq by metis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1139
          from rpath_star[OF 1(2)[unfolded this]] ind[unfolded indep_def]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1140
          show ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1141
        qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1142
      qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1143
  } note my_rule = this
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1144
  { fix z
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1145
    assume h: "z \<in> subtree r x" "z \<in> subtree r y"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1146
    from h(1) have "(z, x) \<in> r^*" by (unfold subtree_def, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1147
    then obtain xs1 where rp1: "rpath r z xs1 x" using star_rpath by metis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1148
    from h(2) have "(z, y) \<in> r^*" by (unfold subtree_def, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1149
    then obtain xs2 where rp2: "rpath r z xs2 y" using star_rpath by metis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1150
    from rp1 rp2
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1151
    have False
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1152
    by (cases, insert my_rule[OF sym_indep[OF assms(1)] rp2 rp1] 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1153
                  my_rule[OF assms(1) rp1 rp2], auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1154
  } thus ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1155
qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1156
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1157
text {*
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1158
  The following lemma @{text "subtree_del"} characterizes the change of sub-tree of 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1159
  @{text "x"} with the removal of an inside edge @{text "(a, b)"}. 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1160
  Note that, the case for the removal of an outside edge has already been dealt with
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1161
  in lemma @{text "subtree_del_outside"}). 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1162
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1163
  This lemma is underpinned by the following two `obvious` facts:
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1164
  \begin{enumearte}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1165
  \item
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1166
  In graph @{text "r"}, for an inside edge @{text "(a,b) \<in> edges_in r x"},  
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1167
  every node @{text "c"} in the sub-tree of @{text "a"} has a path
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1168
  which goes first from @{text "c"} to @{text "a"}, then through edge @{text "(a, b)"}, and 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1169
  finally reaches @{text "x"}. By the uniqueness of path in a tree,
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1170
  all paths from sub-tree of @{text "a"} to @{text "x"} are such constructed, therefore 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1171
  must go through @{text "(a, b)"}. The consequence is: with the removal of @{text "(a,b)"},
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1172
  all such paths will be broken. 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1173
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1174
  \item
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1175
  On the other hand, all paths not originate from within the sub-tree of @{text "a"}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1176
  will not be affected by the removal of edge @{text "(a, b)"}. 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1177
  The reason is simple: if the path is affected by the removal, it must 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1178
  contain @{text "(a, b)"}, then it must originate from within the sub-tree of @{text "a"}.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1179
  \end{enumearte}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1180
*}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1181
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1182
lemma subtree_del_inside: (* ddd *)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1183
    assumes "(a,b) \<in> edges_in r x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1184
    shows "subtree (r - {(a, b)}) x = (subtree r x) - subtree r a"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1185
proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1186
  from assms have asm: "b \<in> subtree r x" "(a, b) \<in> r" by (auto simp:edges_in_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1187
  -- {* The proof follows a common pattern to prove the equality of sets. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1188
  { -- {* The `left to right` direction.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1189
       *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1190
    fix c
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1191
    -- {* Assuming @{text "c"} is inside the sub-tree of @{text "x"} in the reduced graph *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1192
    assume h: "c \<in> subtree (r - {(a, b)}) x" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1193
    -- {* We are going to show that @{text "c"} can not be in the sub-tree of @{text "a"} in 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1194
          the original graph. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1195
    -- {* In other words, all nodes inside the sub-tree of @{text "a"} in the original 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1196
          graph will be removed from the sub-tree of @{text "x"} in the reduced graph. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1197
    -- {* The reason, as analyzed before, is that all paths from within the 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1198
          sub-tree of @{text "a"} are broken with the removal of edge @{text "(a,b)"}.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1199
       *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1200
    have "c \<in> (subtree r x) - subtree r a" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1201
    proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1202
      let ?r' = "r - {(a, b)}" -- {* The reduced graph is abbreviated as @{text "?r'"} *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1203
      from h have "(c, x) \<in> ?r'^*" by (auto simp:subtree_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1204
      -- {* Extract from the reduced graph the path @{text "xs"} from @{text "c"} to @{text "x"}. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1205
      then obtain xs where rp0: "rpath ?r' c xs x" by (rule star_rpath, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1206
      -- {* It is easy to show @{text "xs"} is also a path in the original graph *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1207
      hence rp1: "rpath r c xs x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1208
      proof(rule rpath_transfer)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1209
          from rpath_edges_on[OF rp0] 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1210
          show "edges_on (c # xs) \<subseteq> r" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1211
      qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1212
      -- {* @{text "xs"} is used as the witness to show that @{text "c"} 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1213
                   in the sub-tree of @{text "x"} in the original graph. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1214
      hence "c \<in> subtree r x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1215
         by (rule rpath_star[elim_format], auto simp:subtree_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1216
      -- {* The next step is to show that @{text "c"} can not be in the sub-tree of @{text "a"}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1217
            in the original graph. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1218
      -- {* We need to use the fact that all paths originate from within sub-tree of @{text "a"}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1219
             are broken. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1220
      moreover have "c \<notin> subtree r a"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1221
      proof
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1222
        -- {* Proof by contradiction, suppose otherwise *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1223
        assume otherwise: "c \<in> subtree r a"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1224
        -- {* Then there is a path in original graph leading from @{text "c"} to @{text "a"} *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1225
        obtain xs1 where rp_c: "rpath r c xs1 a" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1226
        proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1227
          from otherwise have "(c, a) \<in> r^*" by (auto simp:subtree_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1228
          thus ?thesis by (rule star_rpath, auto intro!:that)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1229
        qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1230
        -- {* Starting from this path, we are going to construct a fictional 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1231
                  path from @{text "c"} to @{text "x"}, which, as explained before,
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1232
              is broken, so that contradiction can be derived. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1233
        -- {* First, there is a path from @{text "b"} to @{text "x"} *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1234
        obtain ys where rp_b: "rpath r b ys x" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1235
        proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1236
          from asm have "(b, x) \<in> r^*" by (auto simp:subtree_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1237
          thus ?thesis by (rule star_rpath, auto intro!:that)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1238
        qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1239
        -- {* The paths @{text "xs1"} and @{text "ys"} can be 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1240
                 tied together using @{text "(a,b)"} to form a path 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1241
               from @{text "c"} to @{text "x"}: *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1242
        have "rpath r c (xs1 @ b # ys) x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1243
        proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1244
          from rstepI[OF asm(2) rp_b] have "rpath r a (b # ys) x" .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1245
          from rpath_appendI[OF rp_c this]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1246
          show ?thesis .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1247
        qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1248
        -- {* By the uniqueness of path between two nodes of a tree, we have: *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1249
        from rpath_unique[OF rp1 this] have eq_xs: "xs = xs1 @ b # ys" .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1250
        -- {* Contradiction can be derived from from this fictional path . *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1251
        show False
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1252
        proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1253
          -- {* It can be shown that @{term "(a,b)"} is on this fictional path. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1254
          have "(a, b) \<in> edges_on (c#xs)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1255
          proof(cases "xs1 = []")
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1256
            case True
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1257
            from rp_c[unfolded this] have "rpath r c [] a" .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1258
            hence eq_c: "c = a" by (rule rpath_nilE, simp)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1259
            hence "c#xs = a#xs" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1260
            from this and eq_xs have "c#xs = a # xs1 @ b # ys" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1261
            from this[unfolded True] have "c#xs = []@[a,b]@ys" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1262
            thus ?thesis by (auto simp:edges_on_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1263
          next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1264
            case False
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1265
            from rpath_nnl_lastE[OF rp_c this]
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1266
            obtain xs' where "xs1 = xs'@[a]" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1267
            from eq_xs[unfolded this] have "c#xs = (c#xs')@[a,b]@ys" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1268
            thus ?thesis by (unfold edges_on_def, blast)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1269
          qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1270
          -- {* It can also be shown that @{term "(a,b)"} is not on this fictional path. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1271
          moreover have "(a, b) \<notin> edges_on (c#xs)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1272
              using rpath_edges_on[OF rp0] by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1273
          -- {* Contradiction is thus derived. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1274
          ultimately show False by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1275
        qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1276
      qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1277
      ultimately show ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1278
    qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1279
  } moreover {
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1280
    -- {* The `right to left` direction.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1281
       *} 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1282
     fix c
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1283
   -- {* Assuming that @{text "c"} is in the sub-tree of @{text "x"}, but
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1284
         outside of the sub-tree of @{text "a"} in the original graph, *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1285
   assume h: "c \<in> (subtree r x) - subtree r a"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1286
   -- {* we need to show that in the reduced graph, @{text "c"} is still in 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1287
         the sub-tree of @{text "x"}. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1288
   have "c \<in> subtree (r - {(a, b)}) x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1289
   proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1290
      -- {* The proof goes by showing that the path from @{text "c"} to @{text "x"}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1291
            in the original graph is not affected by the removal of @{text "(a,b)"}.
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1292
         *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1293
      from h have "(c, x) \<in> r^*" by (unfold subtree_def, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1294
      -- {* Extract the path @{text "xs"} from @{text "c"} to @{text "x"} in the original graph. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1295
      from star_rpath[OF this] obtain xs where rp: "rpath r c xs x" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1296
      -- {* Show that it is also a path in the reduced graph. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1297
      hence "rpath (r - {(a, b)}) c xs x"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1298
      -- {* The proof goes by using rule @{thm rpath_transfer} *} 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1299
      proof(rule rpath_transfer)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1300
        -- {* We need to show all edges on the path are still in the reduced graph. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1301
        show "edges_on (c # xs) \<subseteq> r - {(a, b)}"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1302
        proof -
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1303
          -- {* It is easy to show that all the edges are in the original graph. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1304
          from rpath_edges_on [OF rp] have " edges_on (c # xs) \<subseteq> r" .
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1305
          -- {* The essential part is to show that @{text "(a, b)"} is not on the path. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1306
          moreover have "(a,b) \<notin> edges_on (c#xs)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1307
          proof
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1308
            -- {* Proof by contradiction, suppose otherwise: *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1309
            assume otherwise: "(a, b) \<in> edges_on (c#xs)"
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1310
            -- {* Then @{text "(a, b)"} is in the middle of the path. 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1311
                  with @{text "l1"} and @{text "l2"} be the nodes in 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1312
                  the front and rear respectively. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1313
              then obtain l1 l2 where eq_xs: 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1314
                "c#xs = l1 @ [a, b] @ l2" by (unfold edges_on_def, blast)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1315
            -- {* From this, it can be shown that @{text "c"} is 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1316
                      in the sub-tree of @{text "a"} *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1317
            have "c \<in> subtree r a" 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1318
            proof(cases "l1 = []")
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1319
              case True
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1320
              -- {* If @{text "l1"} is null, it can be derived that @{text "c = a"}. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1321
              with eq_xs have "c = a" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1322
              -- {* So, @{text "c"} is obviously in the sub-tree of @{text "a"}. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1323
              thus ?thesis by (unfold subtree_def, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1324
            next
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1325
              case False
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1326
              -- {* When @{text "l1"} is not null, it must have a tail @{text "es"}: *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1327
              then obtain e es where "l1 = e#es" by (cases l1, auto)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1328
              -- {* The relation of this tail with @{text "xs"} is derived: *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1329
              with eq_xs have "xs = es@[a,b]@l2" by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1330
              -- {* From this, a path from @{text "c"} to @{text "a"} is made visible: *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1331
              from rp[unfolded this] have "rpath r c (es @ [a] @ (b#l2)) x" by simp
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1332
              thus ?thesis
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1333
              proof(cases rule:rpath_appendE)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1334
                -- {* The path from @{text "c"} to @{text "a"} is extraced 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1335
                             using @{thm "rpath_appendE"}: *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1336
                case 1
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1337
                from rpath_star[OF this(1)] 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1338
                -- {* The extracted path servers as a witness that @{text "c"} is 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1339
                          in the sub-tree of @{text "a"}: *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1340
                show ?thesis by (simp add:subtree_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1341
            qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1342
          qed with h show False by auto         
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1343
         qed ultimately show ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1344
       qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1345
     qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1346
     -- {* From , it is shown that @{text "c"} is in the sub-tree of @{text "x"}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1347
           inthe reduced graph. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1348
     from rpath_star[OF this] show ?thesis by (auto simp:subtree_def)
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1349
    qed
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1350
  } 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1351
  -- {* The equality of sets is derived from the two directions just proved. *}
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1352
  ultimately show ?thesis by auto
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1353
qed 
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1354
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1355
lemma  set_del_rootI:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1356
  assumes "r1 \<subseteq> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1357
  and "a \<in> Domain r1"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1358
  shows "root (r - r1) a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1359
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1360
   let ?r = "r - r1"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1361
  { fix a' 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1362
    assume neq: "a' \<noteq> a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1363
    have "a \<notin> subtree ?r a'"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1364
    proof
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1365
      assume "a \<in> subtree ?r a'"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1366
      hence "(a, a') \<in> ?r^*" by (auto simp:subtree_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1367
      from star_rpath[OF this] obtain xs
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1368
      where rp: "rpath ?r a xs a'" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1369
      from rpathE[OF this] and neq
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1370
      obtain z zs where h: "(a, z) \<in> ?r" "rpath ?r z zs a'" "xs = z#zs" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1371
      from assms(2) obtain z' where z'_in: "(a, z') \<in> r1" by (auto simp:DomainE)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1372
      with assms(1) have "(a, z') \<in> r" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1373
      moreover from h(1) have "(a, z) \<in> r" by simp 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1374
      ultimately have "z' = z" using sgv by (auto simp:single_valued_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1375
      from z'_in[unfolded this] and h(1) show False by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1376
   qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1377
  } thus ?thesis by (intro rootI, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1378
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1379
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1380
lemma edge_del_no_rootI:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1381
  assumes "(a, b) \<in> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1382
  shows "root (r - {(a, b)}) a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1383
  by (rule set_del_rootI, insert assms, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1384
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1385
lemma ancestors_children_unique:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1386
  assumes "z1 \<in> ancestors r x \<inter> children r y"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1387
  and "z2 \<in> ancestors r x \<inter> children r y"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1388
  shows "z1 = z2"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1389
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1390
  from assms have h:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1391
     "(x, z1) \<in> r^+" "(z1, y) \<in> r" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1392
     "(x, z2) \<in> r^+" "(z2, y) \<in> r" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1393
  by (auto simp:ancestors_def children_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1394
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1395
  -- {* From this, a path containing @{text "z1"} is obtained. *}
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1396
  from plus_rpath[OF h(1)] obtain xs1 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1397
     where h1: "rpath r x xs1 z1" "xs1 \<noteq> []" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1398
  from rpath_nnl_lastE[OF this] obtain xs1' where eq_xs1: "xs1 = xs1' @ [z1]"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1399
    by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1400
  from h(2) have h2: "rpath r z1 [y] y" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1401
  from rpath_appendI[OF h1(1) h2, unfolded eq_xs1]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1402
  have rp1: "rpath r x (xs1' @ [z1, y]) y" by simp
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1403
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1404
  -- {* Then, another path containing @{text "z2"} is obtained. *}
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1405
  from plus_rpath[OF h(3)] obtain xs2
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1406
     where h3: "rpath r x xs2 z2" "xs2 \<noteq> []" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1407
  from rpath_nnl_lastE[OF this] obtain xs2' where eq_xs2: "xs2 = xs2' @ [z2]"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1408
    by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1409
  from h(4) have h4: "rpath r z2 [y] y" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1410
  from rpath_appendI[OF h3(1) h4, unfolded eq_xs2]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1411
     have "rpath r x (xs2' @ [z2, y]) y" by simp
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1412
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1413
  -- {* Finally @{text "z1 = z2"} is proved by uniqueness of path. *}
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1414
  from rpath_unique[OF rp1 this]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1415
  have "xs1' @ [z1, y] = xs2' @ [z2, y]" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1416
  thus ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1417
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1418
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1419
lemma ancestors_childrenE:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1420
  assumes "y \<in> ancestors r x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1421
  obtains "x \<in> children r y"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1422
      | z where "z \<in> ancestors r x \<inter> children r y"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1423
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1424
  from assms(1) have "(x, y) \<in> r^+" by (auto simp:ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1425
  from tranclD2[OF this] obtain z where 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1426
     h: "(x, z) \<in> r\<^sup>*" "(z, y) \<in> r" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1427
  from h(1)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1428
  show ?thesis
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1429
  proof(cases rule:rtranclE)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1430
    case base
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1431
    from h(2)[folded this] have "x \<in> children r y" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1432
              by (auto simp:children_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1433
    thus ?thesis by (intro that, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1434
  next
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1435
    case (step u)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1436
    hence "z \<in> ancestors r x" by (auto simp:ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1437
    moreover from h(2) have "z \<in> children r y" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1438
              by (auto simp:children_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1439
    ultimately show ?thesis by (intro that, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1440
  qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1441
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1442
80
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1443
end (* of rtree *)
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1444
80
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1445
lemma subtree_trancl:
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1446
  "subtree r x = {x} \<union> {y. (y, x) \<in> r^+}" (is "?L = ?R")
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1447
proof -
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1448
  { fix z
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1449
    assume "z \<in> ?L"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1450
    hence "z \<in> ?R"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1451
    proof(cases rule:subtreeE)
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1452
      case 2
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1453
      thus ?thesis  
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1454
        by (unfold ancestors_def, auto)
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1455
    qed auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1456
  } moreover
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1457
  { fix z
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1458
    assume "z \<in> ?R"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1459
    hence "z \<in> ?L" 
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1460
      by (unfold subtree_def, auto)
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1461
  } ultimately show ?thesis by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1462
qed
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1463
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1464
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1465
lemma subtree_children:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1466
  "subtree r x = {x} \<union> (\<Union> (subtree r ` (children r x)))" (is "?L = ?R")
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1467
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1468
  { fix z
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1469
    assume "z \<in> ?L"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1470
    hence "z \<in> ?R"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1471
    proof(cases rule:subtreeE[consumes 1])
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1472
      case 2
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1473
      hence "(z, x) \<in> r^+" by (auto simp:ancestors_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1474
      thus ?thesis
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1475
      proof(rule tranclE)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1476
        assume "(z, x) \<in> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1477
        hence "z \<in> children r x" by (unfold children_def, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1478
        moreover have "z \<in> subtree r z" by (auto simp:subtree_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1479
        ultimately show ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1480
      next
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1481
        fix c
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1482
        assume h: "(z, c) \<in> r\<^sup>+" "(c, x) \<in> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1483
        hence "c \<in> children r x" by (auto simp:children_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1484
        moreover from h have "z \<in> subtree r c" by (auto simp:subtree_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1485
        ultimately show ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1486
      qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1487
    qed auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1488
  } moreover {
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1489
    fix z
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1490
    assume h: "z \<in> ?R"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1491
    have "x \<in> subtree r x" by (auto simp:subtree_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1492
    moreover {
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1493
       assume "z \<in> \<Union>(subtree r ` children r x)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1494
       then obtain y where "(y, x) \<in> r" "(z, y) \<in> r^*" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1495
        by (auto simp:subtree_def children_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1496
       hence "(z, x) \<in> r^*" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1497
       hence "z \<in> ?L" by (auto simp:subtree_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1498
    } ultimately have "z \<in> ?L" using h by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1499
  } ultimately show ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1500
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1501
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1502
context fsubtree 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1503
begin
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1504
  
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1505
lemma finite_subtree:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1506
  shows "finite (subtree r x)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1507
proof(induct rule:wf_induct[OF wf])
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1508
  case (1 x)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1509
  have "finite (\<Union>(subtree r ` children r x))"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1510
  proof(rule finite_Union)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1511
    show "finite (subtree r ` children r x)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1512
    proof(cases "children r x = {}")
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1513
      case True
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1514
      thus ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1515
    next
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1516
      case False
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1517
      hence "x \<in> Range r" by (auto simp:children_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1518
      from fb[rule_format, OF this] 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1519
      have "finite (children r x)" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1520
      thus ?thesis by (rule finite_imageI)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1521
    qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1522
  next
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1523
    fix M 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1524
    assume "M \<in> subtree r ` children r x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1525
    then obtain y where h: "y \<in> children r x" "M = subtree r y" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1526
    hence "(y, x) \<in> r" by (auto simp:children_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1527
    from 1[rule_format, OF this, folded h(2)]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1528
    show "finite M" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1529
  qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1530
  thus ?case
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1531
    by (unfold subtree_children finite_Un, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1532
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1533
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1534
end
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1535
58
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1536
definition "pairself f = (\<lambda>(a, b). (f a, f b))"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1537
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1538
definition "rel_map f r = (pairself f ` r)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1539
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1540
lemma rel_mapE: 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1541
  assumes "(a, b) \<in> rel_map f r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1542
  obtains c d 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1543
  where "(c, d) \<in> r" "(a, b) = (f c, f d)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1544
  using assms
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1545
  by (unfold rel_map_def pairself_def, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1546
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1547
lemma rel_mapI: 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1548
  assumes "(a, b) \<in> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1549
    and "c = f a"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1550
    and "d = f b"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1551
  shows "(c, d) \<in> rel_map f r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1552
  using assms
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1553
  by (unfold rel_map_def pairself_def, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1554
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1555
lemma map_appendE:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1556
  assumes "map f zs = xs @ ys"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1557
  obtains xs' ys' 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1558
  where "zs = xs' @ ys'" "xs = map f xs'" "ys = map f ys'"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1559
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1560
  have "\<exists> xs' ys'. zs = xs' @ ys' \<and> xs = map f xs' \<and> ys = map f ys'"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1561
  using assms
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1562
  proof(induct xs arbitrary:zs ys)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1563
    case (Nil zs ys)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1564
    thus ?case by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1565
  next
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1566
    case (Cons x xs zs ys)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1567
    note h = this
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1568
    show ?case
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1569
    proof(cases zs)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1570
      case (Cons e es)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1571
      with h have eq_x: "map f es = xs @ ys" "x = f e" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1572
      from h(1)[OF this(1)]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1573
      obtain xs' ys' where "es = xs' @ ys'" "xs = map f xs'" "ys = map f ys'"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1574
        by blast
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1575
      with Cons eq_x
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1576
      have "zs = (e#xs') @ ys' \<and> x # xs = map f (e#xs') \<and> ys = map f ys'" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1577
      thus ?thesis by metis
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1578
    qed (insert h, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1579
  qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1580
  thus ?thesis by (auto intro!:that)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1581
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1582
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1583
lemma rel_map_mono:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1584
  assumes "r1 \<subseteq> r2"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1585
  shows "rel_map f r1 \<subseteq> rel_map f r2"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1586
  using assms
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1587
  by (auto simp:rel_map_def pairself_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1588
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1589
lemma rel_map_compose [simp]:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1590
    shows "rel_map f1 (rel_map f2 r) = rel_map (f1 o f2) r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1591
    by (auto simp:rel_map_def pairself_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1592
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1593
lemma edges_on_map: "edges_on (map f xs) = rel_map f (edges_on xs)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1594
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1595
  { fix a b
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1596
    assume "(a, b) \<in> edges_on (map f xs)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1597
    then obtain l1 l2 where eq_map: "map f xs = l1 @ [a, b] @ l2" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1598
      by (unfold edges_on_def, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1599
    hence "(a, b) \<in> rel_map f (edges_on xs)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1600
      by (auto elim!:map_appendE intro!:rel_mapI simp:edges_on_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1601
  } moreover { 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1602
    fix a b
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1603
    assume "(a, b) \<in> rel_map f (edges_on xs)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1604
    then obtain c d where 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1605
        h: "(c, d) \<in> edges_on xs" "(a, b) = (f c, f d)" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1606
             by (elim rel_mapE, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1607
    then obtain l1 l2 where
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1608
        eq_xs: "xs = l1 @ [c, d] @ l2" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1609
             by (auto simp:edges_on_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1610
    hence eq_map: "map f xs = map f l1 @ [f c, f d] @ map f l2" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1611
    have "(a, b) \<in> edges_on (map f xs)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1612
    proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1613
      from h(2) have "[f c, f d] = [a, b]" by simp
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1614
      from eq_map[unfolded this] show ?thesis by (auto simp:edges_on_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1615
    qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1616
  } ultimately show ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1617
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1618
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1619
lemma image_id:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1620
  assumes "\<And> x. x \<in> A \<Longrightarrow> f x = x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1621
  shows "f ` A = A"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1622
  using assms by (auto simp:image_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1623
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1624
lemma rel_map_inv_id:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1625
  assumes "inj_on f ((Domain r) \<union> (Range r))"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1626
  shows "(rel_map (inv_into ((Domain r) \<union> (Range r)) f \<circ> f) r) = r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1627
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1628
 let ?f = "(inv_into (Domain r \<union> Range r) f \<circ> f)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1629
 {
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1630
  fix a b
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1631
  assume h0: "(a, b) \<in> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1632
  have "pairself ?f (a, b) = (a, b)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1633
  proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1634
    from assms h0 have "?f a = a" by (auto intro:inv_into_f_f)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1635
    moreover have "?f b = b"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1636
      by (insert h0, simp, intro inv_into_f_f[OF assms], auto intro!:RangeI)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1637
    ultimately show ?thesis by (auto simp:pairself_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1638
  qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1639
 } thus ?thesis by (unfold rel_map_def, intro image_id, case_tac x, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1640
qed 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1641
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1642
lemma rel_map_acyclic:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1643
  assumes "acyclic r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1644
  and "inj_on f ((Domain r) \<union> (Range r))"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1645
  shows "acyclic (rel_map f r)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1646
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1647
  let ?D = "Domain r \<union> Range r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1648
  { fix a 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1649
    assume "(a, a) \<in> (rel_map f r)^+" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1650
    from plus_rpath[OF this]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1651
    obtain xs where rp: "rpath (rel_map f r) a xs a" "xs \<noteq> []" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1652
    from rpath_nnl_lastE[OF this] obtain xs' where eq_xs: "xs = xs'@[a]" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1653
    from rpath_edges_on[OF rp(1)]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1654
    have h: "edges_on (a # xs) \<subseteq> rel_map f r" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1655
    from edges_on_map[of "inv_into ?D f" "a#xs"]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1656
    have "edges_on (map (inv_into ?D f) (a # xs)) = rel_map (inv_into ?D f) (edges_on (a # xs))" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1657
    with rel_map_mono[OF h, of "inv_into ?D f"]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1658
    have "edges_on (map (inv_into ?D f) (a # xs)) \<subseteq> rel_map ((inv_into ?D f) o f) r" by simp
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1659
    from this[unfolded eq_xs]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1660
    have subr: "edges_on (map (inv_into ?D f) (a # xs' @ [a])) \<subseteq> rel_map (inv_into ?D f \<circ> f) r" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1661
    have "(map (inv_into ?D f) (a # xs' @ [a])) = (inv_into ?D f a) # map (inv_into ?D f) xs' @ [inv_into ?D f a]"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1662
      by simp
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1663
    from edges_on_rpathI[OF subr[unfolded this]]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1664
    have "rpath (rel_map (inv_into ?D f \<circ> f) r) 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1665
                      (inv_into ?D f a) (map (inv_into ?D f) xs' @ [inv_into ?D f a]) (inv_into ?D f a)" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1666
    hence "(inv_into ?D f a, inv_into ?D f a) \<in> (rel_map (inv_into ?D f \<circ> f) r)^+"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1667
        by (rule rpath_plus, simp)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1668
    moreover have "(rel_map (inv_into ?D f \<circ> f) r) = r" by (rule rel_map_inv_id[OF assms(2)])
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1669
    moreover note assms(1) 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1670
    ultimately have False by (unfold acyclic_def, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1671
  } thus ?thesis by (auto simp:acyclic_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1672
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1673
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1674
lemma relpow_mult: 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1675
  "((r::'a rel) ^^ m) ^^ n = r ^^ (m*n)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1676
proof(induct n arbitrary:m)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1677
  case (Suc k m)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1678
  thus ?case
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1679
  proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1680
    have h: "(m * k + m) = (m + m * k)" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1681
    show ?thesis 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1682
      apply (simp add:Suc relpow_add[symmetric])
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1683
      by (unfold h, simp)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1684
  qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1685
qed simp
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1686
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1687
lemma compose_relpow_2:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1688
  assumes "r1 \<subseteq> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1689
  and "r2 \<subseteq> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1690
  shows "r1 O r2 \<subseteq> r ^^ (2::nat)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1691
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1692
  { fix a b
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1693
    assume "(a, b) \<in> r1 O r2"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1694
    then obtain e where "(a, e) \<in> r1" "(e, b) \<in> r2"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1695
      by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1696
    with assms have "(a, e) \<in> r" "(e, b) \<in> r" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1697
    hence "(a, b) \<in> r ^^ (Suc (Suc 0))" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1698
  } thus ?thesis by (auto simp:numeral_2_eq_2)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1699
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1700
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1701
lemma acyclic_compose:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1702
  assumes "acyclic r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1703
  and "r1 \<subseteq> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1704
  and "r2 \<subseteq> r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1705
  shows "acyclic (r1 O r2)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1706
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1707
  { fix a
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1708
    assume "(a, a) \<in> (r1 O r2)^+"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1709
    from trancl_mono[OF this compose_relpow_2[OF assms(2, 3)]]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1710
    have "(a, a) \<in> (r ^^ 2) ^+" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1711
    from trancl_power[THEN iffD1, OF this]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1712
    obtain n where h: "(a, a) \<in> (r ^^ 2) ^^ n" "n > 0" by blast
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1713
    from this(1)[unfolded relpow_mult] have h2: "(a, a) \<in> r ^^ (2 * n)" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1714
    have "(a, a) \<in> r^+" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1715
    proof(cases rule:trancl_power[THEN iffD2])
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1716
      from h(2) h2 show "\<exists>n>0. (a, a) \<in> r ^^ n" 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1717
        by (rule_tac x = "2*n" in exI, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1718
    qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1719
    with assms have "False" by (auto simp:acyclic_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1720
  } thus ?thesis by (auto simp:acyclic_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1721
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1722
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1723
lemma children_compose_unfold: 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1724
  "children (r1 O r2) x = \<Union> (children r1 ` (children r2 x))"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1725
  by (auto simp:children_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1726
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1727
lemma fbranch_compose:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1728
  assumes "fbranch r1"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1729
  and "fbranch r2"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1730
  shows "fbranch (r1 O r2)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1731
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1732
  {  fix x
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1733
     assume "x\<in>Range (r1 O r2)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1734
     then obtain y z where h: "(y, z) \<in> r1" "(z, x) \<in> r2" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1735
     have "finite (children (r1 O r2) x)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1736
     proof(unfold children_compose_unfold, rule finite_Union)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1737
      show "finite (children r1 ` children r2 x)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1738
      proof(rule finite_imageI)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1739
        from h(2) have "x \<in> Range r2" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1740
        from assms(2)[unfolded fbranch_def, rule_format, OF this]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1741
        show "finite (children r2 x)" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1742
      qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1743
     next
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1744
       fix M
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1745
       assume "M \<in> children r1 ` children r2 x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1746
       then obtain y where h1: "y \<in> children r2 x" "M = children r1 y" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1747
       show "finite M"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1748
       proof(cases "children r1 y = {}")
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1749
          case True
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1750
          with h1(2) show ?thesis by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1751
       next
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1752
          case False
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1753
          hence "y \<in> Range r1" by (unfold children_def, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1754
          from assms(1)[unfolded fbranch_def, rule_format, OF this, folded h1(2)]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1755
          show ?thesis .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1756
       qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1757
     qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1758
  } thus ?thesis by (unfold fbranch_def, auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1759
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1760
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1761
lemma finite_fbranchI:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1762
  assumes "finite r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1763
  shows "fbranch r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1764
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1765
  { fix x 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1766
    assume "x \<in>Range r"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1767
    have "finite (children r x)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1768
    proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1769
      have "{y. (y, x) \<in> r} \<subseteq> Domain r" by (auto)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1770
      from rev_finite_subset[OF finite_Domain[OF assms] this]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1771
      have "finite {y. (y, x) \<in> r}" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1772
      thus ?thesis by (unfold children_def, simp)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1773
    qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1774
  } thus ?thesis by (auto simp:fbranch_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1775
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1776
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1777
lemma subset_fbranchI:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1778
  assumes "fbranch r1"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1779
  and "r2 \<subseteq> r1"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1780
  shows "fbranch r2"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1781
proof -
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1782
  { fix x
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1783
    assume "x \<in>Range r2"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1784
    with assms(2) have "x \<in> Range r1" by auto
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1785
    from assms(1)[unfolded fbranch_def, rule_format, OF this]
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1786
    have "finite (children r1 x)" .
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1787
    hence "finite (children r2 x)"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1788
    proof(rule rev_finite_subset)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1789
      from assms(2)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1790
      show "children r2 x \<subseteq> children r1 x" by (auto simp:children_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1791
    qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1792
  } thus ?thesis by (auto simp:fbranch_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1793
qed
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1794
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1795
lemma children_subtree: 
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1796
  shows "children r x \<subseteq> subtree r x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1797
  by (auto simp:children_def subtree_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1798
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1799
lemma children_union_kept:
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1800
  assumes "x \<notin> Range r'"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1801
  shows "children (r \<union> r') x = children r x"
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1802
  using assms
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1803
  by (auto simp:children_def)
ad57323fd4d6 Extended RTree.thy
zhangx
parents: 57
diff changeset
  1804
80
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1805
lemma wf_rbase:
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1806
  assumes "wf r"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1807
  obtains b where "(b, a) \<in> r^*" "\<forall> c. (c, b) \<notin> r"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1808
proof -
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1809
  from assms
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1810
  have "\<exists> b. (b, a) \<in> r^* \<and> (\<forall> c. (c, b) \<notin> r)"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1811
  proof(induct) 
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1812
    case (less x)
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1813
    thus ?case
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1814
    proof(cases "\<exists> z. (z, x) \<in> r")
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1815
      case False
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1816
      moreover have "(x, x) \<in> r^*" by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1817
      ultimately show ?thesis by metis
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1818
    next
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1819
      case True
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1820
      then obtain z where h_z: "(z, x) \<in> r" by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1821
      from less[OF this]
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1822
      obtain b where "(b, z) \<in> r^*" "(\<forall>c. (c, b) \<notin> r)"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1823
        by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1824
      moreover from this(1) h_z have "(b, x) \<in> r^*" by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1825
      ultimately show ?thesis by metis
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1826
    qed
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1827
  qed
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1828
  with that show ?thesis by metis
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1829
qed
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1830
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1831
lemma wf_base:
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1832
  assumes "wf r"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1833
  and "a \<in> Range r"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1834
  obtains b where "(b, a) \<in> r^+" "\<forall> c. (c, b) \<notin> r"
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1835
proof -
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1836
  from assms(2) obtain a' where h_a: "(a', a) \<in> r" by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1837
  from wf_rbase[OF assms(1), of a]
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1838
  obtain b where h_b: "(b, a) \<in> r\<^sup>*" "\<forall>c. (c, b) \<notin> r" by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1839
  from rtranclD[OF this(1)]
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1840
  have "b = a \<or>  b \<noteq> a \<and> (b, a) \<in> r\<^sup>+" by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1841
  moreover have "b \<noteq> a" using h_a h_b(2) by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1842
  ultimately have "(b, a) \<in> r\<^sup>+" by auto
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1843
  with h_b(2) and that show ?thesis by metis
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1844
qed
17305a85493d CpsG.thy retrofiting almost completed. An important mile stone.
zhangx
parents: 64
diff changeset
  1845
57
f1b39d77db00 Added generic theory "RTree.thy"
xingyuan zhang <xingyuanzhang@126.com>
parents:
diff changeset
  1846
end