src/HOL/Library/Subseq_Order.thy
author paulson <lp15@cam.ac.uk>
Wed, 21 Feb 2018 12:57:49 +0000
changeset 67683 817944aeac3f
parent 67399 eab6ce8368fa
child 73411 1f1366966296
permissions -rw-r--r--
Lots of new material about matrices, etc.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
65956
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
     1
(*  Title:      HOL/Library/Subseq_Order.thy
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 61585
diff changeset
     2
    Author:     Peter Lammich, Uni Muenster <peter.lammich@uni-muenster.de>
65956
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
     3
    Author:     Florian Haftmann, TU Muenchen
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 61585
diff changeset
     4
    Author:     Tobias Nipkow, TU Muenchen
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
     5
*)
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
     6
65956
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
     7
section \<open>Subsequence Ordering\<close>
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
     8
65956
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
     9
theory Subseq_Order
49088
5cd8b4426a57 Main is implicitly imported via Sublist
Christian Sternagel
parents: 49085
diff changeset
    10
imports Sublist
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    11
begin
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    12
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
    13
text \<open>
65956
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
    14
  This theory defines subsequence ordering on lists. A list \<open>ys\<close> is a subsequence of a
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 61585
diff changeset
    15
  list \<open>xs\<close>, iff one obtains \<open>ys\<close> by erasing some elements from \<open>xs\<close>.
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
    16
\<close>
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    17
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
    18
subsection \<open>Definitions and basic lemmas\<close>
26735
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
65956
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
    23
definition "xs \<le> ys \<longleftrightarrow> subseq xs ys" for xs ys :: "'a list"
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 61585
diff changeset
    24
definition "xs < ys \<longleftrightarrow> xs \<le> ys \<and> \<not> ys \<le> xs" for xs ys :: "'a list"
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    25
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    26
instance ..
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    27
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    28
end
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    29
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    30
instance list :: (type) order
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    31
proof
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    32
  fix xs ys zs :: "'a list"
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 61585
diff changeset
    33
  show "xs < ys \<longleftrightarrow> xs \<le> ys \<and> \<not> ys \<le> xs"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 61585
diff changeset
    34
    unfolding less_list_def ..
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 61585
diff changeset
    35
  show "xs \<le> xs"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 61585
diff changeset
    36
    by (simp add: less_eq_list_def)
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 61585
diff changeset
    37
  show "xs = ys" if "xs \<le> ys" and "ys \<le> xs"
65956
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
    38
    using that unfolding less_eq_list_def by (rule subseq_order.antisym)
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 61585
diff changeset
    39
  show "xs \<le> zs" if "xs \<le> ys" and "ys \<le> zs"
65956
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
    40
    using that unfolding less_eq_list_def by (rule subseq_order.order_trans)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    41
qed
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    42
49093
fdc301f592c4 forgot to add lemmas
Christian Sternagel
parents: 49088
diff changeset
    43
lemmas less_eq_list_induct [consumes 1, case_names empty drop take] =
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 65956
diff changeset
    44
  list_emb.induct [of "(=)", folded less_eq_list_def]
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 65956
diff changeset
    45
lemmas less_eq_list_drop = list_emb.list_emb_Cons [of "(=)", folded less_eq_list_def]
65956
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
    46
lemmas le_list_Cons2_iff [simp, code] = subseq_Cons2_iff [folded less_eq_list_def]
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
    47
lemmas le_list_map = subseq_map [folded less_eq_list_def]
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
    48
lemmas le_list_filter = subseq_filter [folded less_eq_list_def]
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 65956
diff changeset
    49
lemmas le_list_length = list_emb_length [of "(=)", folded less_eq_list_def]
49093
fdc301f592c4 forgot to add lemmas
Christian Sternagel
parents: 49088
diff changeset
    50
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    51
lemma less_list_length: "xs < ys \<Longrightarrow> length xs < length ys"
65956
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
    52
  by (metis list_emb_length subseq_same_length le_neq_implies_less less_list_def less_eq_list_def)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    53
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    54
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
    55
  by (metis less_eq_list_def list_emb_Nil order_less_le)
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    56
49085
4eef5c2ff5ad introduced "sub" as abbreviation for "emb (op =)";
Christian Sternagel
parents: 49084
diff changeset
    57
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
    58
  by (metis list_emb_Nil less_eq_list_def less_list_def)
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    59
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    60
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
    61
  by (unfold less_le less_eq_list_def) (auto)
26735
39be3c7e643a added theory Sublist_Order
haftmann
parents:
diff changeset
    62
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    63
lemma less_list_take_iff: "x # xs < x # ys \<longleftrightarrow> xs < ys"
65956
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
    64
  by (metis subseq_Cons2_iff less_list_def less_eq_list_def)
33431
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    65
af516ed40e72 Completely overhauled
nipkow
parents: 30738
diff changeset
    66
lemma less_list_drop_many: "xs < ys \<Longrightarrow> xs < zs @ ys"
65956
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
    67
  by (metis subseq_append_le_same_iff subseq_drop_many order_less_le
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 61585
diff changeset
    68
      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"
65956
639eb3617a86 reorganised material on sublists
eberlm <eberlm@in.tum.de>
parents: 65869
diff changeset
    71
  by (metis less_list_def less_eq_list_def subseq_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