src/HOL/UNITY/ListOrder.thy
author wenzelm
Sat, 14 Nov 2009 18:45:24 +0100
changeset 33687 3222fa052846
parent 32960 69916a850301
child 35416 d8d7d1b785af
permissions -rw-r--r--
include HOL-Boogie keywords by default;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32235
diff changeset
     1
(*  Title:      HOL/UNITY/ListOrder.thy
6708
62beb3336b02 lists are partially ordered by the prefix relation
paulson
parents:
diff changeset
     2
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
62beb3336b02 lists are partially ordered by the prefix relation
paulson
parents:
diff changeset
     3
    Copyright   1998  University of Cambridge
62beb3336b02 lists are partially ordered by the prefix relation
paulson
parents:
diff changeset
     4
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
     5
Lists are partially ordered by Charpentier's Generalized Prefix Relation
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
     6
   (xs,ys) : genPrefix(r)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
     7
     if ys = xs' @ zs where length xs = length xs'
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
     8
     and corresponding elements of xs, xs' are pairwise related by r
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
     9
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    10
Also overloads <= and < for lists!
6708
62beb3336b02 lists are partially ordered by the prefix relation
paulson
parents:
diff changeset
    11
*)
62beb3336b02 lists are partially ordered by the prefix relation
paulson
parents:
diff changeset
    12
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    13
header {*The Prefix Ordering on Lists*}
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    14
27682
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    15
theory ListOrder
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    16
imports Main
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    17
begin
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    18
23767
7272a839ccd9 Adapted to new inductive definition package.
berghofe
parents: 16417
diff changeset
    19
inductive_set
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    20
  genPrefix :: "('a * 'a)set => ('a list * 'a list)set"
23767
7272a839ccd9 Adapted to new inductive definition package.
berghofe
parents: 16417
diff changeset
    21
  for r :: "('a * 'a)set"
7272a839ccd9 Adapted to new inductive definition package.
berghofe
parents: 16417
diff changeset
    22
 where
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    23
   Nil:     "([],[]) : genPrefix(r)"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    24
23767
7272a839ccd9 Adapted to new inductive definition package.
berghofe
parents: 16417
diff changeset
    25
 | prepend: "[| (xs,ys) : genPrefix(r);  (x,y) : r |] ==>
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32235
diff changeset
    26
             (x#xs, y#ys) : genPrefix(r)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    27
23767
7272a839ccd9 Adapted to new inductive definition package.
berghofe
parents: 16417
diff changeset
    28
 | append:  "(xs,ys) : genPrefix(r) ==> (xs, ys@zs) : genPrefix(r)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    29
27682
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    30
instantiation list :: (type) ord 
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    31
begin
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    32
27682
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    33
definition
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    34
  prefix_def:        "xs <= zs \<longleftrightarrow>  (xs, zs) : genPrefix Id"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    35
27682
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    36
definition
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    37
  strict_prefix_def: "xs < zs  \<longleftrightarrow>  xs \<le> zs \<and> \<not> zs \<le> (xs :: 'a list)"
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    38
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    39
instance ..  
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    40
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    41
(*Constants for the <= and >= relations, used below in translations*)
27682
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    42
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    43
end
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
    44
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    45
constdefs
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    46
  Le :: "(nat*nat) set"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    47
    "Le == {(x,y). x <= y}"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    48
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    49
  Ge :: "(nat*nat) set"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    50
    "Ge == {(x,y). y <= x}"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    51
23767
7272a839ccd9 Adapted to new inductive definition package.
berghofe
parents: 16417
diff changeset
    52
abbreviation
7272a839ccd9 Adapted to new inductive definition package.
berghofe
parents: 16417
diff changeset
    53
  pfixLe :: "[nat list, nat list] => bool"  (infixl "pfixLe" 50)  where
7272a839ccd9 Adapted to new inductive definition package.
berghofe
parents: 16417
diff changeset
    54
  "xs pfixLe ys == (xs,ys) : genPrefix Le"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    55
23767
7272a839ccd9 Adapted to new inductive definition package.
berghofe
parents: 16417
diff changeset
    56
abbreviation
7272a839ccd9 Adapted to new inductive definition package.
berghofe
parents: 16417
diff changeset
    57
  pfixGe :: "[nat list, nat list] => bool"  (infixl "pfixGe" 50)  where
7272a839ccd9 Adapted to new inductive definition package.
berghofe
parents: 16417
diff changeset
    58
  "xs pfixGe ys == (xs,ys) : genPrefix Ge"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    59
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    60
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    61
subsection{*preliminary lemmas*}
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    62
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    63
lemma Nil_genPrefix [iff]: "([], xs) : genPrefix r"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    64
by (cut_tac genPrefix.Nil [THEN genPrefix.append], auto)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    65
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    66
lemma genPrefix_length_le: "(xs,ys) : genPrefix r ==> length xs <= length ys"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    67
by (erule genPrefix.induct, auto)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    68
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    69
lemma cdlemma:
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    70
     "[| (xs', ys'): genPrefix r |]  
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    71
      ==> (ALL x xs. xs' = x#xs --> (EX y ys. ys' = y#ys & (x,y) : r & (xs, ys) : genPrefix r))"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    72
apply (erule genPrefix.induct, blast, blast)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    73
apply (force intro: genPrefix.append)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    74
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    75
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    76
(*As usual converting it to an elimination rule is tiresome*)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    77
lemma cons_genPrefixE [elim!]: 
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    78
     "[| (x#xs, zs): genPrefix r;   
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    79
         !!y ys. [| zs = y#ys;  (x,y) : r;  (xs, ys) : genPrefix r |] ==> P  
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    80
      |] ==> P"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    81
by (drule cdlemma, simp, blast)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    82
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    83
lemma Cons_genPrefix_Cons [iff]:
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    84
     "((x#xs,y#ys) : genPrefix r) = ((x,y) : r & (xs,ys) : genPrefix r)"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    85
by (blast intro: genPrefix.prepend)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    86
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    87
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    88
subsection{*genPrefix is a partial order*}
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    89
30198
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
    90
lemma refl_genPrefix: "refl r ==> refl (genPrefix r)"
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
    91
apply (unfold refl_on_def, auto)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    92
apply (induct_tac "x")
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    93
prefer 2 apply (blast intro: genPrefix.prepend)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    94
apply (blast intro: genPrefix.Nil)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    95
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    96
30198
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
    97
lemma genPrefix_refl [simp]: "refl r ==> (l,l) : genPrefix r"
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
    98
by (erule refl_onD [OF refl_genPrefix UNIV_I])
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
    99
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   100
lemma genPrefix_mono: "r<=s ==> genPrefix r <= genPrefix s"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   101
apply clarify
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   102
apply (erule genPrefix.induct)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   103
apply (auto intro: genPrefix.append)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   104
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   105
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   106
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   107
(** Transitivity **)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   108
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   109
(*A lemma for proving genPrefix_trans_O*)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   110
lemma append_genPrefix [rule_format]:
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   111
     "ALL zs. (xs @ ys, zs) : genPrefix r --> (xs, zs) : genPrefix r"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   112
by (induct_tac "xs", auto)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   113
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   114
(*Lemma proving transitivity and more*)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   115
lemma genPrefix_trans_O [rule_format]: 
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   116
     "(x, y) : genPrefix r  
32235
8f9b8d14fc9f "more standard" argument order of relation composition (op O)
krauss
parents: 30198
diff changeset
   117
      ==> ALL z. (y,z) : genPrefix s --> (x, z) : genPrefix (r O s)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   118
apply (erule genPrefix.induct)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   119
  prefer 3 apply (blast dest: append_genPrefix)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   120
 prefer 2 apply (blast intro: genPrefix.prepend, blast)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   121
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   122
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   123
lemma genPrefix_trans [rule_format]:
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   124
     "[| (x,y) : genPrefix r;  (y,z) : genPrefix r;  trans r |]  
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   125
      ==> (x,z) : genPrefix r"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   126
apply (rule trans_O_subset [THEN genPrefix_mono, THEN subsetD])
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   127
 apply assumption
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   128
apply (blast intro: genPrefix_trans_O)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   129
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   130
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   131
lemma prefix_genPrefix_trans [rule_format]: 
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   132
     "[| x<=y;  (y,z) : genPrefix r |] ==> (x, z) : genPrefix r"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   133
apply (unfold prefix_def)
32235
8f9b8d14fc9f "more standard" argument order of relation composition (op O)
krauss
parents: 30198
diff changeset
   134
apply (drule genPrefix_trans_O, assumption)
8f9b8d14fc9f "more standard" argument order of relation composition (op O)
krauss
parents: 30198
diff changeset
   135
apply simp
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   136
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   137
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   138
lemma genPrefix_prefix_trans [rule_format]: 
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   139
     "[| (x,y) : genPrefix r;  y<=z |] ==> (x,z) : genPrefix r"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   140
apply (unfold prefix_def)
32235
8f9b8d14fc9f "more standard" argument order of relation composition (op O)
krauss
parents: 30198
diff changeset
   141
apply (drule genPrefix_trans_O, assumption)
8f9b8d14fc9f "more standard" argument order of relation composition (op O)
krauss
parents: 30198
diff changeset
   142
apply simp
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   143
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   144
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   145
lemma trans_genPrefix: "trans r ==> trans (genPrefix r)"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   146
by (blast intro: transI genPrefix_trans)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   147
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   148
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   149
(** Antisymmetry **)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   150
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   151
lemma genPrefix_antisym [rule_format]:
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   152
     "[| (xs,ys) : genPrefix r;  antisym r |]  
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   153
      ==> (ys,xs) : genPrefix r --> xs = ys"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   154
apply (erule genPrefix.induct)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   155
  txt{*Base case*}
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   156
  apply blast
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   157
 txt{*prepend case*}
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   158
 apply (simp add: antisym_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   159
txt{*append case is the hardest*}
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   160
apply clarify
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   161
apply (subgoal_tac "length zs = 0", force)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   162
apply (drule genPrefix_length_le)+
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   163
apply (simp del: length_0_conv)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   164
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   165
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   166
lemma antisym_genPrefix: "antisym r ==> antisym (genPrefix r)"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   167
by (blast intro: antisymI genPrefix_antisym)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   168
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   169
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   170
subsection{*recursion equations*}
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   171
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   172
lemma genPrefix_Nil [simp]: "((xs, []) : genPrefix r) = (xs = [])"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   173
apply (induct_tac "xs")
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   174
prefer 2 apply blast
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   175
apply simp
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   176
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   177
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   178
lemma same_genPrefix_genPrefix [simp]: 
30198
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
   179
    "refl r ==> ((xs@ys, xs@zs) : genPrefix r) = ((ys,zs) : genPrefix r)"
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
   180
apply (unfold refl_on_def)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   181
apply (induct_tac "xs")
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   182
apply (simp_all (no_asm_simp))
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   183
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   184
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   185
lemma genPrefix_Cons:
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   186
     "((xs, y#ys) : genPrefix r) =  
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   187
      (xs=[] | (EX z zs. xs=z#zs & (z,y) : r & (zs,ys) : genPrefix r))"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   188
by (case_tac "xs", auto)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   189
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   190
lemma genPrefix_take_append:
30198
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
   191
     "[| refl r;  (xs,ys) : genPrefix r |]  
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   192
      ==>  (xs@zs, take (length xs) ys @ zs) : genPrefix r"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   193
apply (erule genPrefix.induct)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   194
apply (frule_tac [3] genPrefix_length_le)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   195
apply (simp_all (no_asm_simp) add: diff_is_0_eq [THEN iffD2])
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   196
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   197
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   198
lemma genPrefix_append_both:
30198
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
   199
     "[| refl r;  (xs,ys) : genPrefix r;  length xs = length ys |]  
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   200
      ==>  (xs@zs, ys @ zs) : genPrefix r"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   201
apply (drule genPrefix_take_append, assumption)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   202
apply (simp add: take_all)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   203
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   204
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   205
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   206
(*NOT suitable for rewriting since [y] has the form y#ys*)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   207
lemma append_cons_eq: "xs @ y # ys = (xs @ [y]) @ ys"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   208
by auto
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   209
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   210
lemma aolemma:
30198
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
   211
     "[| (xs,ys) : genPrefix r;  refl r |]  
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   212
      ==> length xs < length ys --> (xs @ [ys ! length xs], ys) : genPrefix r"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   213
apply (erule genPrefix.induct)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   214
  apply blast
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   215
 apply simp
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   216
txt{*Append case is hardest*}
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   217
apply simp
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   218
apply (frule genPrefix_length_le [THEN le_imp_less_or_eq])
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   219
apply (erule disjE)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   220
apply (simp_all (no_asm_simp) add: neq_Nil_conv nth_append)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   221
apply (blast intro: genPrefix.append, auto)
15481
fc075ae929e4 the new subst tactic, by Lucas Dixon
paulson
parents: 13798
diff changeset
   222
apply (subst append_cons_eq, fast intro: genPrefix_append_both genPrefix.append)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   223
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   224
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   225
lemma append_one_genPrefix:
30198
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
   226
     "[| (xs,ys) : genPrefix r;  length xs < length ys;  refl r |]  
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   227
      ==> (xs @ [ys ! length xs], ys) : genPrefix r"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   228
by (blast intro: aolemma [THEN mp])
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   229
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   230
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   231
(** Proving the equivalence with Charpentier's definition **)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   232
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   233
lemma genPrefix_imp_nth [rule_format]:
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   234
     "ALL i ys. i < length xs  
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   235
                --> (xs, ys) : genPrefix r --> (xs ! i, ys ! i) : r"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   236
apply (induct_tac "xs", auto)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   237
apply (case_tac "i", auto)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   238
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   239
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   240
lemma nth_imp_genPrefix [rule_format]:
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   241
     "ALL ys. length xs <= length ys   
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   242
      --> (ALL i. i < length xs --> (xs ! i, ys ! i) : r)   
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   243
      --> (xs, ys) : genPrefix r"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   244
apply (induct_tac "xs")
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   245
apply (simp_all (no_asm_simp) add: less_Suc_eq_0_disj all_conj_distrib)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   246
apply clarify
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   247
apply (case_tac "ys")
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   248
apply (force+)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   249
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   250
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   251
lemma genPrefix_iff_nth:
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   252
     "((xs,ys) : genPrefix r) =  
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   253
      (length xs <= length ys & (ALL i. i < length xs --> (xs!i, ys!i) : r))"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   254
apply (blast intro: genPrefix_length_le genPrefix_imp_nth nth_imp_genPrefix)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   255
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   256
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   257
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   258
subsection{*The type of lists is partially ordered*}
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   259
30198
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
   260
declare refl_Id [iff] 
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   261
        antisym_Id [iff] 
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   262
        trans_Id [iff]
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   263
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   264
lemma prefix_refl [iff]: "xs <= (xs::'a list)"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   265
by (simp add: prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   266
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   267
lemma prefix_trans: "!!xs::'a list. [| xs <= ys; ys <= zs |] ==> xs <= zs"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   268
apply (unfold prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   269
apply (blast intro: genPrefix_trans)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   270
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   271
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   272
lemma prefix_antisym: "!!xs::'a list. [| xs <= ys; ys <= xs |] ==> xs = ys"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   273
apply (unfold prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   274
apply (blast intro: genPrefix_antisym)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   275
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   276
27682
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
   277
lemma prefix_less_le_not_le: "!!xs::'a list. (xs < zs) = (xs <= zs & \<not> zs \<le> xs)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   278
by (unfold strict_prefix_def, auto)
6708
62beb3336b02 lists are partially ordered by the prefix relation
paulson
parents:
diff changeset
   279
12338
de0f4a63baa5 renamed class "term" to "type" (actually "HOL.type");
wenzelm
parents: 6810
diff changeset
   280
instance list :: (type) order
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   281
  by (intro_classes,
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   282
      (assumption | rule prefix_refl prefix_trans prefix_antisym
27682
25aceefd4786 added class preorder
haftmann
parents: 23767
diff changeset
   283
                     prefix_less_le_not_le)+)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   284
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   285
(*Monotonicity of "set" operator WRT prefix*)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   286
lemma set_mono: "xs <= ys ==> set xs <= set ys"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   287
apply (unfold prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   288
apply (erule genPrefix.induct, auto)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   289
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   290
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   291
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   292
(** recursion equations **)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   293
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   294
lemma Nil_prefix [iff]: "[] <= xs"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   295
apply (unfold prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   296
apply (simp add: Nil_genPrefix)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   297
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   298
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   299
lemma prefix_Nil [simp]: "(xs <= []) = (xs = [])"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   300
apply (unfold prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   301
apply (simp add: genPrefix_Nil)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   302
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   303
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   304
lemma Cons_prefix_Cons [simp]: "(x#xs <= y#ys) = (x=y & xs<=ys)"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   305
by (simp add: prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   306
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   307
lemma same_prefix_prefix [simp]: "(xs@ys <= xs@zs) = (ys <= zs)"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   308
by (simp add: prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   309
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   310
lemma append_prefix [iff]: "(xs@ys <= xs) = (ys <= [])"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   311
by (insert same_prefix_prefix [of xs ys "[]"], simp)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   312
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   313
lemma prefix_appendI [simp]: "xs <= ys ==> xs <= ys@zs"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   314
apply (unfold prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   315
apply (erule genPrefix.append)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   316
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   317
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   318
lemma prefix_Cons: 
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   319
   "(xs <= y#ys) = (xs=[] | (? zs. xs=y#zs & zs <= ys))"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   320
by (simp add: prefix_def genPrefix_Cons)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   321
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   322
lemma append_one_prefix: 
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   323
  "[| xs <= ys; length xs < length ys |] ==> xs @ [ys ! length xs] <= ys"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   324
apply (unfold prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   325
apply (simp add: append_one_genPrefix)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   326
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   327
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   328
lemma prefix_length_le: "xs <= ys ==> length xs <= length ys"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   329
apply (unfold prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   330
apply (erule genPrefix_length_le)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   331
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   332
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   333
lemma splemma: "xs<=ys ==> xs~=ys --> length xs < length ys"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   334
apply (unfold prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   335
apply (erule genPrefix.induct, auto)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   336
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   337
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   338
lemma strict_prefix_length_less: "xs < ys ==> length xs < length ys"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   339
apply (unfold strict_prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   340
apply (blast intro: splemma [THEN mp])
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   341
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   342
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   343
lemma mono_length: "mono length"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   344
by (blast intro: monoI prefix_length_le)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   345
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   346
(*Equivalence to the definition used in Lex/Prefix.thy*)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   347
lemma prefix_iff: "(xs <= zs) = (EX ys. zs = xs@ys)"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   348
apply (unfold prefix_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   349
apply (auto simp add: genPrefix_iff_nth nth_append)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   350
apply (rule_tac x = "drop (length xs) zs" in exI)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   351
apply (rule nth_equalityI)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   352
apply (simp_all (no_asm_simp) add: nth_append)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   353
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   354
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   355
lemma prefix_snoc [simp]: "(xs <= ys@[y]) = (xs = ys@[y] | xs <= ys)"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   356
apply (simp add: prefix_iff)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   357
apply (rule iffI)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   358
 apply (erule exE)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   359
 apply (rename_tac "zs")
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   360
 apply (rule_tac xs = zs in rev_exhaust)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   361
  apply simp
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   362
 apply clarify
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   363
 apply (simp del: append_assoc add: append_assoc [symmetric], force)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   364
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   365
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   366
lemma prefix_append_iff:
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   367
     "(xs <= ys@zs) = (xs <= ys | (? us. xs = ys@us & us <= zs))"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   368
apply (rule_tac xs = zs in rev_induct)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   369
 apply force
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   370
apply (simp del: append_assoc add: append_assoc [symmetric], force)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   371
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   372
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   373
(*Although the prefix ordering is not linear, the prefixes of a list
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   374
  are linearly ordered.*)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   375
lemma common_prefix_linear [rule_format]:
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   376
     "!!zs::'a list. xs <= zs --> ys <= zs --> xs <= ys | ys <= xs"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   377
by (rule_tac xs = zs in rev_induct, auto)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   378
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   379
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   380
subsection{*pfixLe, pfixGe: properties inherited from the translations*}
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   381
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   382
(** pfixLe **)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   383
30198
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
   384
lemma refl_Le [iff]: "refl Le"
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
   385
by (unfold refl_on_def Le_def, auto)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   386
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   387
lemma antisym_Le [iff]: "antisym Le"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   388
by (unfold antisym_def Le_def, auto)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   389
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   390
lemma trans_Le [iff]: "trans Le"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   391
by (unfold trans_def Le_def, auto)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   392
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   393
lemma pfixLe_refl [iff]: "x pfixLe x"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   394
by simp
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   395
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   396
lemma pfixLe_trans: "[| x pfixLe y; y pfixLe z |] ==> x pfixLe z"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   397
by (blast intro: genPrefix_trans)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   398
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   399
lemma pfixLe_antisym: "[| x pfixLe y; y pfixLe x |] ==> x = y"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   400
by (blast intro: genPrefix_antisym)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   401
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   402
lemma prefix_imp_pfixLe: "xs<=ys ==> xs pfixLe ys"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   403
apply (unfold prefix_def Le_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   404
apply (blast intro: genPrefix_mono [THEN [2] rev_subsetD])
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   405
done
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   406
30198
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
   407
lemma refl_Ge [iff]: "refl Ge"
922f944f03b2 name changes
nipkow
parents: 27682
diff changeset
   408
by (unfold refl_on_def Ge_def, auto)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   409
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   410
lemma antisym_Ge [iff]: "antisym Ge"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   411
by (unfold antisym_def Ge_def, auto)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   412
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   413
lemma trans_Ge [iff]: "trans Ge"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   414
by (unfold trans_def Ge_def, auto)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   415
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   416
lemma pfixGe_refl [iff]: "x pfixGe x"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   417
by simp
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   418
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   419
lemma pfixGe_trans: "[| x pfixGe y; y pfixGe z |] ==> x pfixGe z"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   420
by (blast intro: genPrefix_trans)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   421
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   422
lemma pfixGe_antisym: "[| x pfixGe y; y pfixGe x |] ==> x = y"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   423
by (blast intro: genPrefix_antisym)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   424
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   425
lemma prefix_imp_pfixGe: "xs<=ys ==> xs pfixGe ys"
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   426
apply (unfold prefix_def Ge_def)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   427
apply (blast intro: genPrefix_mono [THEN [2] rev_subsetD])
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 12338
diff changeset
   428
done
6708
62beb3336b02 lists are partially ordered by the prefix relation
paulson
parents:
diff changeset
   429
62beb3336b02 lists are partially ordered by the prefix relation
paulson
parents:
diff changeset
   430
end