| author | wenzelm | 
| Fri, 03 Sep 2021 19:56:03 +0200 | |
| changeset 74222 | bf595bfbdc98 | 
| parent 73411 | 1f1366966296 | 
| child 75648 | aa0403e5535f | 
| permissions | -rw-r--r-- | 
| 65956 
639eb3617a86
reorganised material on sublists
 eberlm <eberlm@in.tum.de> parents: 
65869diff
changeset | 1 | (* Title: HOL/Library/Subseq_Order.thy | 
| 63465 | 2 | Author: Peter Lammich, Uni Muenster <peter.lammich@uni-muenster.de> | 
| 65956 
639eb3617a86
reorganised material on sublists
 eberlm <eberlm@in.tum.de> parents: 
65869diff
changeset | 3 | Author: Florian Haftmann, TU Muenchen | 
| 63465 | 4 | Author: Tobias Nipkow, TU Muenchen | 
| 26735 | 5 | *) | 
| 6 | ||
| 65956 
639eb3617a86
reorganised material on sublists
 eberlm <eberlm@in.tum.de> parents: 
65869diff
changeset | 7 | section \<open>Subsequence Ordering\<close> | 
| 26735 | 8 | |
| 65956 
639eb3617a86
reorganised material on sublists
 eberlm <eberlm@in.tum.de> parents: 
65869diff
changeset | 9 | theory Subseq_Order | 
| 49088 
5cd8b4426a57
Main is implicitly imported via Sublist
 Christian Sternagel parents: 
49085diff
changeset | 10 | imports Sublist | 
| 26735 | 11 | begin | 
| 12 | ||
| 60500 | 13 | text \<open> | 
| 65956 
639eb3617a86
reorganised material on sublists
 eberlm <eberlm@in.tum.de> parents: 
65869diff
changeset | 14 | This theory defines subsequence ordering on lists. A list \<open>ys\<close> is a subsequence of a | 
| 63465 | 15 | list \<open>xs\<close>, iff one obtains \<open>ys\<close> by erasing some elements from \<open>xs\<close>. | 
| 60500 | 16 | \<close> | 
| 26735 | 17 | |
| 60500 | 18 | subsection \<open>Definitions and basic lemmas\<close> | 
| 26735 | 19 | |
| 33431 | 20 | instantiation list :: (type) ord | 
| 26735 | 21 | begin | 
| 22 | ||
| 65956 
639eb3617a86
reorganised material on sublists
 eberlm <eberlm@in.tum.de> parents: 
65869diff
changeset | 23 | definition "xs \<le> ys \<longleftrightarrow> subseq xs ys" for xs ys :: "'a list" | 
| 63465 | 24 | definition "xs < ys \<longleftrightarrow> xs \<le> ys \<and> \<not> ys \<le> xs" for xs ys :: "'a list" | 
| 26735 | 25 | |
| 49085 
4eef5c2ff5ad
introduced "sub" as abbreviation for "emb (op =)";
 Christian Sternagel parents: 
49084diff
changeset | 26 | instance .. | 
| 33431 | 27 | |
| 28 | end | |
| 29 | ||
| 49085 
4eef5c2ff5ad
introduced "sub" as abbreviation for "emb (op =)";
 Christian Sternagel parents: 
49084diff
changeset | 30 | instance list :: (type) order | 
| 
4eef5c2ff5ad
introduced "sub" as abbreviation for "emb (op =)";
 Christian Sternagel parents: 
49084diff
changeset | 31 | proof | 
| 26735 | 32 | fix xs ys zs :: "'a list" | 
| 63465 | 33 | show "xs < ys \<longleftrightarrow> xs \<le> ys \<and> \<not> ys \<le> xs" | 
| 34 | unfolding less_list_def .. | |
| 35 | show "xs \<le> xs" | |
| 36 | by (simp add: less_eq_list_def) | |
| 37 | show "xs = ys" if "xs \<le> ys" and "ys \<le> xs" | |
| 73411 | 38 | using that unfolding less_eq_list_def | 
| 39 | by (rule subseq_order.antisym) | |
| 63465 | 40 | show "xs \<le> zs" if "xs \<le> ys" and "ys \<le> zs" | 
| 73411 | 41 | using that unfolding less_eq_list_def | 
| 42 | by (rule subseq_order.order_trans) | |
| 26735 | 43 | qed | 
| 44 | ||
| 49093 | 45 | lemmas less_eq_list_induct [consumes 1, case_names empty drop take] = | 
| 67399 | 46 | list_emb.induct [of "(=)", folded less_eq_list_def] | 
| 47 | 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: 
65869diff
changeset | 48 | 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: 
65869diff
changeset | 49 | lemmas le_list_map = subseq_map [folded less_eq_list_def] | 
| 
639eb3617a86
reorganised material on sublists
 eberlm <eberlm@in.tum.de> parents: 
65869diff
changeset | 50 | lemmas le_list_filter = subseq_filter [folded less_eq_list_def] | 
| 67399 | 51 | lemmas le_list_length = list_emb_length [of "(=)", folded less_eq_list_def] | 
| 49093 | 52 | |
| 33431 | 53 | lemma less_list_length: "xs < ys \<Longrightarrow> length xs < length ys" | 
| 65956 
639eb3617a86
reorganised material on sublists
 eberlm <eberlm@in.tum.de> parents: 
65869diff
changeset | 54 | by (metis list_emb_length subseq_same_length le_neq_implies_less less_list_def less_eq_list_def) | 
| 26735 | 55 | |
| 33431 | 56 | lemma less_list_empty [simp]: "[] < xs \<longleftrightarrow> xs \<noteq> []" | 
| 57497 
4106a2bc066a
renamed "list_hembeq" into slightly shorter "list_emb"
 Christian Sternagel parents: 
50516diff
changeset | 57 | by (metis less_eq_list_def list_emb_Nil order_less_le) | 
| 33431 | 58 | |
| 49085 
4eef5c2ff5ad
introduced "sub" as abbreviation for "emb (op =)";
 Christian Sternagel parents: 
49084diff
changeset | 59 | lemma less_list_below_empty [simp]: "xs < [] \<longleftrightarrow> False" | 
| 57497 
4106a2bc066a
renamed "list_hembeq" into slightly shorter "list_emb"
 Christian Sternagel parents: 
50516diff
changeset | 60 | by (metis list_emb_Nil less_eq_list_def less_list_def) | 
| 33431 | 61 | |
| 62 | lemma less_list_drop: "xs < ys \<Longrightarrow> xs < x # ys" | |
| 49085 
4eef5c2ff5ad
introduced "sub" as abbreviation for "emb (op =)";
 Christian Sternagel parents: 
49084diff
changeset | 63 | by (unfold less_le less_eq_list_def) (auto) | 
| 26735 | 64 | |
| 33431 | 65 | lemma less_list_take_iff: "x # xs < x # ys \<longleftrightarrow> xs < ys" | 
| 65956 
639eb3617a86
reorganised material on sublists
 eberlm <eberlm@in.tum.de> parents: 
65869diff
changeset | 66 | by (metis subseq_Cons2_iff less_list_def less_eq_list_def) | 
| 33431 | 67 | |
| 68 | lemma less_list_drop_many: "xs < ys \<Longrightarrow> xs < zs @ ys" | |
| 65956 
639eb3617a86
reorganised material on sublists
 eberlm <eberlm@in.tum.de> parents: 
65869diff
changeset | 69 | by (metis subseq_append_le_same_iff subseq_drop_many order_less_le | 
| 63465 | 70 | self_append_conv2 less_eq_list_def) | 
| 33431 | 71 | |
| 72 | 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: 
65869diff
changeset | 73 | by (metis less_list_def less_eq_list_def subseq_append') | 
| 33431 | 74 | |
| 75 | lemma less_list_rev_take: "xs @ zs < ys @ zs \<longleftrightarrow> xs < ys" | |
| 49085 
4eef5c2ff5ad
introduced "sub" as abbreviation for "emb (op =)";
 Christian Sternagel parents: 
49084diff
changeset | 76 | by (unfold less_le less_eq_list_def) auto | 
| 26735 | 77 | |
| 78 | end |