src/HOL/Library/Sublist_Order.thy
author wenzelm
Wed, 24 Jun 2009 21:28:02 +0200
changeset 31794 71af1fd6a5e4
parent 30738 0842e906300c
child 33431 af516ed40e72
permissions -rw-r--r--
renamed Variable.import_thms to Variable.import (back again cf. ed7aa5a350ef -- Alice is no longer supported); renamed Variable.importT_thms to Variable.importT (again);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
     1
(*  Title:      HOL/Library/Sublist_Order.thy
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
     2
    Authors:    Peter Lammich, Uni Muenster <peter.lammich@uni-muenster.de>
30738
0842e906300c normalized imports
haftmann
parents: 28562
diff changeset
     3
                Florian Haftmann, TU Muenchen
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
     4
*)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
     5
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
     6
header {* Sublist Ordering *}
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
     7
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
     8
theory Sublist_Order
30738
0842e906300c normalized imports
haftmann
parents: 28562
diff changeset
     9
imports Main
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    10
begin
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    11
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    12
text {*
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    13
  This theory defines sublist ordering on lists.
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    14
  A list @{text ys} is a sublist of a list @{text xs},
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    15
  iff one obtains @{text ys} by erasing some elements from @{text xs}.
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    16
*}
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    17
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    18
subsection {* Definitions and basic lemmas *}
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    19
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    20
instantiation list :: (type) order
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    21
begin
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    22
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    23
inductive less_eq_list where
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    24
  empty [simp, intro!]: "[] \<le> xs"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    25
  | drop: "ys \<le> xs \<Longrightarrow> ys \<le> x # xs"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    26
  | take: "ys \<le> xs \<Longrightarrow> x # ys \<le> x # xs"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    27
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    28
lemmas ileq_empty = empty
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    29
lemmas ileq_drop = drop
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    30
lemmas ileq_take = take
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    31
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    32
lemma ileq_cases [cases set, case_names empty drop take]:
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    33
  assumes "xs \<le> ys"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    34
    and "xs = [] \<Longrightarrow> P"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    35
    and "\<And>z zs. ys = z # zs \<Longrightarrow> xs \<le> zs \<Longrightarrow> P"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    36
    and "\<And>x zs ws. xs = x # zs \<Longrightarrow> ys = x # ws \<Longrightarrow> zs \<le> ws \<Longrightarrow> P"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    37
  shows P
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    38
  using assms by (blast elim: less_eq_list.cases)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    39
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    40
lemma ileq_induct [induct set, case_names empty drop take]:
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    41
  assumes "xs \<le> ys"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    42
    and "\<And>zs. P [] zs"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    43
    and "\<And>z zs ws. ws \<le> zs \<Longrightarrow>  P ws zs \<Longrightarrow> P ws (z # zs)"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    44
    and "\<And>z zs ws. ws \<le> zs \<Longrightarrow> P ws zs \<Longrightarrow> P (z # ws) (z # zs)"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    45
  shows "P xs ys" 
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    46
  using assms by (induct rule: less_eq_list.induct) blast+
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    47
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    48
definition
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 27682
diff changeset
    49
  [code del]: "(xs \<Colon> 'a list) < ys \<longleftrightarrow> xs \<le> ys \<and> \<not> ys \<le> xs"
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    50
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    51
lemma ileq_length: "xs \<le> ys \<Longrightarrow> length xs \<le> length ys"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    52
  by (induct rule: ileq_induct) auto
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    53
lemma ileq_below_empty [simp]: "xs \<le> [] \<longleftrightarrow> xs = []"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    54
  by (auto dest: ileq_length)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    55
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    56
instance proof
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    57
  fix xs ys :: "'a list"
27682
25aceefd4786 added class preorder
haftmann
parents: 27487
diff changeset
    58
  show "xs < ys \<longleftrightarrow> xs \<le> ys \<and> \<not> ys \<le> xs" unfolding less_list_def .. 
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    59
next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    60
  fix xs :: "'a list"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    61
  show "xs \<le> xs" by (induct xs) (auto intro!: ileq_empty ileq_drop ileq_take)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    62
next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    63
  fix xs ys :: "'a list"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    64
  (* TODO: Is there a simpler proof ? *)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    65
  { fix n
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    66
    have "!!l l'. \<lbrakk>l\<le>l'; l'\<le>l; n=length l + length l'\<rbrakk> \<Longrightarrow> l=l'"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    67
    proof (induct n rule: nat_less_induct)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    68
      case (1 n l l') from "1.prems"(1) show ?case proof (cases rule: ileq_cases)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    69
        case empty with "1.prems"(2) show ?thesis by auto 
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    70
      next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    71
        case (drop a l2') with "1.prems"(2) have "length l'\<le>length l" "length l \<le> length l2'" "1+length l2' = length l'" by (auto dest: ileq_length)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    72
        hence False by simp thus ?thesis ..
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    73
      next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    74
        case (take a l1' l2') hence LEN': "length l1' + length l2' < length l + length l'" by simp
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    75
        from "1.prems" have LEN: "length l' = length l" by (auto dest!: ileq_length)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    76
        from "1.prems"(2) show ?thesis proof (cases rule: ileq_cases[case_names empty' drop' take'])
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    77
          case empty' with take LEN show ?thesis by simp 
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    78
        next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    79
          case (drop' ah l2h) with take LEN have "length l1' \<le> length l2h" "1+length l2h = length l2'" "length l2' = length l1'" by (auto dest: ileq_length)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    80
          hence False by simp thus ?thesis ..
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    81
        next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    82
          case (take' ah l1h l2h)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    83
          with take have 2: "ah=a" "l1h=l2'" "l2h=l1'" "l1' \<le> l2'" "l2' \<le> l1'" by auto
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    84
          with LEN' "1.hyps" "1.prems"(3) have "l1'=l2'" by blast
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    85
          with take 2 show ?thesis by simp
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    86
        qed
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    87
      qed
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    88
    qed
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    89
  }
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    90
  moreover assume "xs \<le> ys" "ys \<le> xs"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    91
  ultimately show "xs = ys" by blast
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    92
next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    93
  fix xs ys zs :: "'a list"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    94
  {
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    95
    fix n
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    96
    have "!!x y z. \<lbrakk>x \<le> y; y \<le> z; n=length x + length y + length z\<rbrakk> \<Longrightarrow> x \<le> z" 
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    97
    proof (induct rule: nat_less_induct[case_names I])
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    98
      case (I n x y z)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    99
      from I.prems(2) show ?case proof (cases rule: ileq_cases)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   100
        case empty with I.prems(1) show ?thesis by auto
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   101
      next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   102
        case (drop a z') hence "length x + length y + length z' < length x + length y + length z" by simp
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   103
        with I.hyps I.prems(3,1) drop(2) have "x\<le>z'" by blast
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   104
        with drop(1) show ?thesis by (auto intro: ileq_drop)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   105
      next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   106
        case (take a y' z') from I.prems(1) show ?thesis proof (cases rule: ileq_cases[case_names empty' drop' take'])
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   107
          case empty' thus ?thesis by auto
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   108
        next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   109
          case (drop' ah y'h) with take have "x\<le>y'" "y'\<le>z'" "length x + length y' + length z' < length x + length y + length z" by auto
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   110
          with I.hyps I.prems(3) have "x\<le>z'" by (blast)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   111
          with take(2) show ?thesis  by (auto intro: ileq_drop)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   112
        next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   113
          case (take' ah x' y'h) with take have 2: "x=a#x'" "x'\<le>y'" "y'\<le>z'" "length x' + length y' + length z' < length x + length y + length z" by auto
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   114
          with I.hyps I.prems(3) have "x'\<le>z'" by blast
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   115
          with 2 take(2) show ?thesis by (auto intro: ileq_take)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   116
        qed
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   117
      qed
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   118
    qed
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   119
  }
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   120
  moreover assume "xs \<le> ys" "ys \<le> zs"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   121
  ultimately show "xs \<le> zs" by blast
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   122
qed
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   123
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   124
end
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   125
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   126
lemmas ileq_intros = ileq_empty ileq_drop ileq_take
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   127
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   128
lemma ileq_drop_many: "xs \<le> ys \<Longrightarrow> xs \<le> zs @ ys"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   129
  by (induct zs) (auto intro: ileq_drop)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   130
lemma ileq_take_many: "xs \<le> ys \<Longrightarrow> zs @ xs \<le> zs @ ys"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   131
  by (induct zs) (auto intro: ileq_take)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   132
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   133
lemma ileq_same_length: "xs \<le> ys \<Longrightarrow> length xs = length ys \<Longrightarrow> xs = ys"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   134
  by (induct rule: ileq_induct) (auto dest: ileq_length)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   135
lemma ileq_same_append [simp]: "x # xs \<le> xs \<longleftrightarrow> False"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   136
  by (auto dest: ileq_length)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   137
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   138
lemma ilt_length [intro]:
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   139
  assumes "xs < ys"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   140
  shows "length xs < length ys"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   141
proof -
27682
25aceefd4786 added class preorder
haftmann
parents: 27487
diff changeset
   142
  from assms have "xs \<le> ys" and "xs \<noteq> ys" by (simp_all add: less_le)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   143
  moreover with ileq_length have "length xs \<le> length ys" by auto
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   144
  ultimately show ?thesis by (auto intro: ileq_same_length)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   145
qed
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   146
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   147
lemma ilt_empty [simp]: "[] < xs \<longleftrightarrow> xs \<noteq> []"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   148
  by (unfold less_list_def, auto)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   149
lemma ilt_emptyI: "xs \<noteq> [] \<Longrightarrow> [] < xs"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   150
  by (unfold less_list_def, auto)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   151
lemma ilt_emptyD: "[] < xs \<Longrightarrow> xs \<noteq> []"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   152
  by (unfold less_list_def, auto)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   153
lemma ilt_below_empty[simp]: "xs < [] \<Longrightarrow> False"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   154
  by (auto dest: ilt_length)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   155
lemma ilt_drop: "xs < ys \<Longrightarrow> xs < x # ys"
27682
25aceefd4786 added class preorder
haftmann
parents: 27487
diff changeset
   156
  by (unfold less_le) (auto intro: ileq_intros)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   157
lemma ilt_take: "xs < ys \<Longrightarrow> x # xs < x # ys"
27682
25aceefd4786 added class preorder
haftmann
parents: 27487
diff changeset
   158
  by (unfold less_le) (auto intro: ileq_intros)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   159
lemma ilt_drop_many: "xs < ys \<Longrightarrow> xs < zs @ ys"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   160
  by (induct zs) (auto intro: ilt_drop)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   161
lemma ilt_take_many: "xs < ys \<Longrightarrow> zs @ xs < zs @ ys"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   162
  by (induct zs) (auto intro: ilt_take)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   163
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   164
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   165
subsection {* Appending elements *}
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   166
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   167
lemma ileq_rev_take: "xs \<le> ys \<Longrightarrow> xs @ [x] \<le> ys @ [x]"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   168
  by (induct rule: ileq_induct) (auto intro: ileq_intros ileq_drop_many)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   169
lemma ilt_rev_take: "xs < ys \<Longrightarrow> xs @ [x] < ys @ [x]"
27682
25aceefd4786 added class preorder
haftmann
parents: 27487
diff changeset
   170
  by (unfold less_le) (auto dest: ileq_rev_take)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   171
lemma ileq_rev_drop: "xs \<le> ys \<Longrightarrow> xs \<le> ys @ [x]"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   172
  by (induct rule: ileq_induct) (auto intro: ileq_intros)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   173
lemma ileq_rev_drop_many: "xs \<le> ys \<Longrightarrow> xs \<le> ys @ zs"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   174
  by (induct zs rule: rev_induct) (auto dest: ileq_rev_drop)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   175
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   176
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   177
subsection {* Relation to standard list operations *}
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   178
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   179
lemma ileq_map: "xs \<le> ys \<Longrightarrow> map f xs \<le> map f ys"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   180
  by (induct rule: ileq_induct) (auto intro: ileq_intros)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   181
lemma ileq_filter_left[simp]: "filter f xs \<le> xs"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   182
  by (induct xs) (auto intro: ileq_intros)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   183
lemma ileq_filter: "xs \<le> ys \<Longrightarrow> filter f xs \<le> filter f ys"
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   184
  by (induct rule: ileq_induct) (auto intro: ileq_intros) 
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   185
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
   186
end