@@ -3239,6 +3239,14 @@ apply/subseqP; exists (m1 ++ m2); rewrite !size_cat.
32393239by rewrite !mask_cat // sz_m1 sz_m2.
32403240qed.
32413241
3242+ lemma subseq_catR [' a] (s s1 s2 : ' a list) :
3243+ subseq s s1 => subseq s (s1 ++ s2).
3244+ proof. by move=> *; rewrite -[s]cats0 &(cat_subseq) // sub0seq. qed.
3245+
3246+ lemma subseq_catL [' a] (s s1 s2 : ' a list) :
3247+ subseq s s2 => subseq s (s1 ++ s2).
3248+ proof. by move=> *; rewrite -[s]cat0s &(cat_subseq) // sub0seq. qed.
3249+
32423250lemma subseq_refl (s : ' a list) : subseq s s.
32433251proof. by elim: s => //= x s IHs; rewrite eqxx. qed.
32443252
@@ -3258,9 +3266,43 @@ qed.
32583266lemma subseq_cons (s : ' a list) x : subseq s (x :: s).
32593267proof. by apply/(@cat_subseq [] s [x] s)=> //; apply/subseq_refl. qed.
32603268
3269+ lemma subseq_consI [' a] (x : ' a) (s1 s2 : ' a list) :
3270+ subseq (x :: s1) s2 => subseq s1 s2.
3271+ proof.
3272+ case /subseqP=> m [eqsz h]; apply/subseqP.
3273+ elim: m s2 eqsz h => [|b m ih] [|x2 s2] // =.
3274+ move/addzI => eqsz; case : b => /= _.
3275+ - by case => <<- ->; exists (false :: m) => /#.
3276+ by case /(ih _ eqsz) => m' [*]; exists (false :: m' ) => /= /#.
3277+ qed.
3278+
32613279lemma subseq_rcons (s : ' a list) x : subseq s (rcons s x).
32623280proof. by rewrite -{1}(@cats0 s) -cats1 cat_subseq // subseq_refl. qed.
32633281
3282+ lemma subseq_take [' a] (i : int ) (s1 s2 : ' a list) :
3283+ subseq s1 s2 => subseq (take i s1) s2.
3284+ proof.
3285+ move=> *; apply: (subseq_trans s1) => //.
3286+ by rewrite -{2}[s1](cat_take_drop i) &(subseq_catR) &(subseq_refl).
3287+ qed.
3288+
3289+ lemma subseq_drop [' a] (i : int ) (s1 s2 : ' a list) :
3290+ subseq s1 s2 => subseq (drop i s1) s2.
3291+ proof.
3292+ move=> *; apply: (subseq_trans s1) => //.
3293+ by rewrite -{2}[s1](cat_take_drop i) &(subseq_catL) &(subseq_refl).
3294+ qed.
3295+
3296+ lemma subseq_drop_congr [' a] (i : int ) (s1 s2 : ' a list) :
3297+ subseq s1 s2 => subseq (drop i s1) (drop i s2).
3298+ proof.
3299+ elim/natind: i s1 s2 => [i le0_i|i ge0_i ih].
3300+ - by move=> *; rewrite !drop_le0.
3301+ case=> [|x1 s1]; [by move=> *; apply: sub0seq | case=> //= x2 s2 h].
3302+ rewrite !(ifF (_ <= 0)) ~-1:/#; apply: ih => //.
3303+ by move: h; case: (x2 = x1) => //= ? /subseq_consI.
3304+ qed.
3305+
32643306lemma rem_subseq x (s : ' a list) : subseq (rem x s) s.
32653307proof.
32663308elim: s => // = y s ih; rewrite eq_sym.
0 commit comments