@@ -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 : ' 
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 : ' 
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 : ' 
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