src/HOL/Library/Sublist_Order.thy
author Christian Sternagel
Thu, 30 Aug 2012 13:06:04 +0900
changeset 49088 5cd8b4426a57
parent 49085 4eef5c2ff5ad
child 49093 fdc301f592c4
permissions -rw-r--r--
Main is implicitly imported via Sublist
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>
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
     3
                Florian Haftmann, Tobias Nipkow, 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
49088
5cd8b4426a57 Main is implicitly imported via Sublist
Christian Sternagel
parents: 49085
diff changeset
     9
imports Sublist
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
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    20
instantiation list :: (type) ord
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    21
begin
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    22
49084
e3973567ed4f base Sublist_Order on Sublist (using a simplified form of embedding as sublist relation)
Christian Sternagel
parents: 37765
diff changeset
    23
definition
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    24
  "(xs :: 'a list) \<le> ys \<longleftrightarrow> sub xs ys"
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    25
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    26
definition
49084
e3973567ed4f base Sublist_Order on Sublist (using a simplified form of embedding as sublist relation)
Christian Sternagel
parents: 37765
diff changeset
    27
  "(xs :: 'a list) < ys \<longleftrightarrow> xs \<le> ys \<and> \<not> ys \<le> xs"
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    28
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    29
instance ..
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    30
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    31
end
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    32
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    33
instance list :: (type) order
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    34
proof
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    35
  fix xs ys :: "'a list"
27682
25aceefd4786 added class preorder
haftmann
parents: 27487
diff changeset
    36
  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
    37
next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    38
  fix xs :: "'a list"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    39
  show "xs \<le> xs" by (simp add: less_eq_list_def)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    40
next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    41
  fix xs ys :: "'a list"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    42
  assume "xs <= ys" and "ys <= xs"
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    43
  thus "xs = ys" by (unfold less_eq_list_def) (rule sub_antisym)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    44
next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    45
  fix xs ys zs :: "'a list"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    46
  assume "xs <= ys" and "ys <= zs"
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    47
  thus "xs <= zs" by (unfold less_eq_list_def) (rule sub_trans)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    48
qed
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    49
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    50
lemma less_list_length: "xs < ys \<Longrightarrow> length xs < length ys"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    51
  by (metis emb_length sub_same_length le_neq_implies_less less_list_def less_eq_list_def)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    52
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    53
lemma less_list_empty [simp]: "[] < xs \<longleftrightarrow> xs \<noteq> []"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    54
  by (metis less_eq_list_def emb_Nil order_less_le)
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    55
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    56
lemma less_list_below_empty [simp]: "xs < [] \<longleftrightarrow> False"
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    57
  by (metis emb_Nil less_eq_list_def less_list_def)
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    58
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    59
lemma less_list_drop: "xs < ys \<Longrightarrow> xs < x # ys"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    60
  by (unfold less_le less_eq_list_def) (auto)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    61
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    62
lemma less_list_take_iff: "x # xs < x # ys \<longleftrightarrow> xs < ys"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    63
  by (metis sub_Cons2_iff less_list_def less_eq_list_def)
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    64
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    65
lemma less_list_drop_many: "xs < ys \<Longrightarrow> xs < zs @ ys"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    66
  by (metis sub_append_le_same_iff sub_drop_many order_less_le self_append_conv2 less_eq_list_def)
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    67
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    68
lemma less_list_take_many_iff: "zs @ xs < zs @ ys \<longleftrightarrow> xs < ys"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    69
  by (metis less_list_def less_eq_list_def sub_append')
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    70
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    71
lemma less_list_rev_take: "xs @ zs < ys @ zs \<longleftrightarrow> xs < ys"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    72
  by (unfold less_le less_eq_list_def) auto
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    73
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    74
end