src/HOL/Library/Sublist_Order.thy
author wenzelm
Wed, 08 Apr 2015 21:24:27 +0200
changeset 59975 da10875adf8e
parent 58881 b9556a055632
child 60500 903bb1495239
permissions -rw-r--r--
more standard Isabelle/ML tool setup; proper file headers; tuned whitespace;
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
58881
b9556a055632 modernized header;
wenzelm
parents: 57497
diff changeset
     6
section {* Sublist Ordering *}
26735
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
50516
ed6b40d15d1c renamed "emb" to "list_hembeq";
Christian Sternagel
parents: 49093
diff changeset
    24
  "(xs :: 'a list) \<le> ys \<longleftrightarrow> sublisteq 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"
50516
ed6b40d15d1c renamed "emb" to "list_hembeq";
Christian Sternagel
parents: 49093
diff changeset
    43
  thus "xs = ys" by (unfold less_eq_list_def) (rule sublisteq_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"
50516
ed6b40d15d1c renamed "emb" to "list_hembeq";
Christian Sternagel
parents: 49093
diff changeset
    47
  thus "xs <= zs" by (unfold less_eq_list_def) (rule sublisteq_trans)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    48
qed
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    49
49093
fdc301f592c4 forgot to add lemmas
Christian Sternagel
parents: 49088
diff changeset
    50
lemmas less_eq_list_induct [consumes 1, case_names empty drop take] =
57497
4106a2bc066a renamed "list_hembeq" into slightly shorter "list_emb"
Christian Sternagel
parents: 50516
diff changeset
    51
  list_emb.induct [of "op =", folded less_eq_list_def]
4106a2bc066a renamed "list_hembeq" into slightly shorter "list_emb"
Christian Sternagel
parents: 50516
diff changeset
    52
lemmas less_eq_list_drop = list_emb.list_emb_Cons [of "op =", folded less_eq_list_def]
50516
ed6b40d15d1c renamed "emb" to "list_hembeq";
Christian Sternagel
parents: 49093
diff changeset
    53
lemmas le_list_Cons2_iff [simp, code] = sublisteq_Cons2_iff [folded less_eq_list_def]
ed6b40d15d1c renamed "emb" to "list_hembeq";
Christian Sternagel
parents: 49093
diff changeset
    54
lemmas le_list_map = sublisteq_map [folded less_eq_list_def]
ed6b40d15d1c renamed "emb" to "list_hembeq";
Christian Sternagel
parents: 49093
diff changeset
    55
lemmas le_list_filter = sublisteq_filter [folded less_eq_list_def]
57497
4106a2bc066a renamed "list_hembeq" into slightly shorter "list_emb"
Christian Sternagel
parents: 50516
diff changeset
    56
lemmas le_list_length = list_emb_length [of "op =", folded less_eq_list_def]
49093
fdc301f592c4 forgot to add lemmas
Christian Sternagel
parents: 49088
diff changeset
    57
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    58
lemma less_list_length: "xs < ys \<Longrightarrow> length xs < length ys"
57497
4106a2bc066a renamed "list_hembeq" into slightly shorter "list_emb"
Christian Sternagel
parents: 50516
diff changeset
    59
  by (metis list_emb_length sublisteq_same_length le_neq_implies_less less_list_def less_eq_list_def)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    60
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    61
lemma less_list_empty [simp]: "[] < xs \<longleftrightarrow> xs \<noteq> []"
57497
4106a2bc066a renamed "list_hembeq" into slightly shorter "list_emb"
Christian Sternagel
parents: 50516
diff changeset
    62
  by (metis less_eq_list_def list_emb_Nil order_less_le)
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    63
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    64
lemma less_list_below_empty [simp]: "xs < [] \<longleftrightarrow> False"
57497
4106a2bc066a renamed "list_hembeq" into slightly shorter "list_emb"
Christian Sternagel
parents: 50516
diff changeset
    65
  by (metis list_emb_Nil less_eq_list_def less_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: "xs < ys \<Longrightarrow> xs < x # ys"
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    68
  by (unfold less_le less_eq_list_def) (auto)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    69
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    70
lemma less_list_take_iff: "x # xs < x # ys \<longleftrightarrow> xs < ys"
50516
ed6b40d15d1c renamed "emb" to "list_hembeq";
Christian Sternagel
parents: 49093
diff changeset
    71
  by (metis sublisteq_Cons2_iff less_list_def less_eq_list_def)
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    72
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    73
lemma less_list_drop_many: "xs < ys \<Longrightarrow> xs < zs @ ys"
50516
ed6b40d15d1c renamed "emb" to "list_hembeq";
Christian Sternagel
parents: 49093
diff changeset
    74
  by (metis sublisteq_append_le_same_iff sublisteq_drop_many order_less_le self_append_conv2 less_eq_list_def)
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    75
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    76
lemma less_list_take_many_iff: "zs @ xs < zs @ ys \<longleftrightarrow> xs < ys"
50516
ed6b40d15d1c renamed "emb" to "list_hembeq";
Christian Sternagel
parents: 49093
diff changeset
    77
  by (metis less_list_def less_eq_list_def sublisteq_append')
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    78
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    79
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
    80
  by (unfold less_le less_eq_list_def) auto
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    81
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    82
end