src/HOL/Library/Sublist_Order.thy
author Christian Sternagel
Wed, 29 Aug 2012 16:25:35 +0900
changeset 49085 4eef5c2ff5ad
parent 49084 e3973567ed4f
child 49088 5cd8b4426a57
permissions -rw-r--r--
introduced "sub" as abbreviation for "emb (op =)"; Sublist_Order is now based on Sublist.sub; simplified and moved most lemmas on sub from Sublist_Order to Sublist; Sublist_Order merely contains ord and order instances for sub plus some lemmas on the strict part of the order
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
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
     9
imports
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    10
  Main
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    11
  Sublist
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    12
begin
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    13
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    14
text {*
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    15
  This theory defines sublist ordering on lists.
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    16
  A list @{text ys} is a sublist of a list @{text xs},
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    17
  iff one obtains @{text ys} by erasing some elements from @{text xs}.
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    18
*}
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    19
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    20
subsection {* Definitions and basic lemmas *}
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    21
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    22
instantiation list :: (type) ord
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    23
begin
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    24
49084
e3973567ed4f base Sublist_Order on Sublist (using a simplified form of embedding as sublist relation)
Christian Sternagel
parents: 37765
diff changeset
    25
definition
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    26
  "(xs :: 'a list) \<le> ys \<longleftrightarrow> sub xs ys"
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    27
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    28
definition
49084
e3973567ed4f base Sublist_Order on Sublist (using a simplified form of embedding as sublist relation)
Christian Sternagel
parents: 37765
diff changeset
    29
  "(xs :: 'a list) < ys \<longleftrightarrow> xs \<le> ys \<and> \<not> ys \<le> xs"
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    30
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    31
instance ..
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    32
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    33
end
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    34
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    35
instance list :: (type) order
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    36
proof
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    37
  fix xs ys :: "'a list"
27682
25aceefd4786 added class preorder
haftmann
parents: 27487
diff changeset
    38
  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
    39
next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    40
  fix xs :: "'a list"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    41
  show "xs \<le> xs" by (simp add: less_eq_list_def)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    42
next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    43
  fix xs ys :: "'a list"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    44
  assume "xs <= ys" and "ys <= xs"
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    45
  thus "xs = ys" by (unfold less_eq_list_def) (rule sub_antisym)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    46
next
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    47
  fix xs ys zs :: "'a list"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    48
  assume "xs <= ys" and "ys <= zs"
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    49
  thus "xs <= zs" by (unfold less_eq_list_def) (rule sub_trans)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    50
qed
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    51
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    52
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
    53
  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
    54
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    55
lemma less_list_empty [simp]: "[] < xs \<longleftrightarrow> xs \<noteq> []"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    56
  by (metis less_eq_list_def emb_Nil order_less_le)
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    57
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    58
lemma less_list_below_empty [simp]: "xs < [] \<longleftrightarrow> False"
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    59
  by (metis emb_Nil less_eq_list_def less_list_def)
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    60
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    61
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
    62
  by (unfold less_le less_eq_list_def) (auto)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    63
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    64
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
    65
  by (metis sub_Cons2_iff less_list_def less_eq_list_def)
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    66
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    67
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
    68
  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
    69
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    70
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
    71
  by (metis less_list_def less_eq_list_def sub_append')
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    72
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    73
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
    74
  by (unfold less_le less_eq_list_def) auto
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    75
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    76
end