Theory SubList

subsection‹Sublists›

theory SubList
  imports
    "HOL-Library.Sublist"
    "HOL-Library.Multiset"
begin

lemmas subseq_trans = subseq_order.order_trans

lemma subseq_Cons_Cons: 
  assumes "subseq (a # as) (b # bs)"
  shows "subseq as bs"
  using assms by (cases "a = b") (auto intro: subseq_Cons')

lemma subseq_induct2:
  " subseq xs ys;
   bs. P [] bs;
   a as bs.  subseq as bs; P as bs   P (a # as) (a # bs);
   a as b bs.  a  b; subseq as bs; subseq (a # as) bs; P as bs; P (a # as) bs   P (a # as) (b # bs) 
   P xs ys" 
proof (induct ys arbitrary: xs)
  case Nil then show ?case by (metis list_emb_Nil2)
next
  case (Cons y ys')
  note Cons_ys = Cons
  note sl = Cons(2)
  note step_eq = Cons(4)
  note step_neq = Cons(5)
  show ?case proof (cases xs) 
    case Nil show ?thesis unfolding Nil using Cons.prems(2) by auto
  next
    case (Cons x xs') 
    have sl': "subseq xs' ys'" by (metis Cons sl subseq_Cons_Cons)
    from sl' have P': "P xs' ys'" using Cons_ys by auto
    show ?thesis proof (cases "x = y")
      case False 
      have sl'': "subseq (x # xs') ys'" using sl unfolding Cons using False by auto
      then have P'': "P (x # xs') ys'" by (metis Cons.hyps Cons_ys(3) step_eq step_neq)
      show ?thesis using step_neq[OF False sl' sl'' P' P''] unfolding Cons by auto
    next
      case True 
      show ?thesis using step_eq[OF sl' P'] unfolding Cons True[symmetric] by auto
    qed
  qed
qed

lemma subseq_submultiset:
  "subseq xs ys  mset xs ⊆# mset ys"
  by (induct rule: list_emb.induct) (auto intro: subset_mset.order_trans)

lemma subseq_subset:
  "subseq xs ys  set xs  set ys"
  by (induct rule: list_emb.induct) auto

lemma remove1_subseq:
  "subseq (remove1 x xs) xs"
  by (induct xs) auto

lemma subseq_concat:
  assumes "x. x  set xs  subseq (f x) (g x)"
  shows "subseq (concat (map f xs)) (concat (map g xs))"
  using assms by (induct xs) (auto intro: list_emb_append_mono)

end