Skip to content

Commit 48a21c3

Browse files
namasikanamstrub
authored andcommitted
List: new lemmas: subseq_catR, subseq_catL, subseq_consI, subseq_take, subseq_drop, subseq_drop_congr
1 parent 6e0cab7 commit 48a21c3

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

theories/datatypes/List.ec

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3239,6 +3239,14 @@ apply/subseqP; exists (m1 ++ m2); rewrite !size_cat.
32393239
by rewrite !mask_cat // sz_m1 sz_m2.
32403240
qed.
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+
32423250
lemma subseq_refl (s : 'a list) : subseq s s.
32433251
proof. by elim: s => //= x s IHs; rewrite eqxx. qed.
32443252
@@ -3258,9 +3266,43 @@ qed.
32583266
lemma subseq_cons (s : 'a list) x : subseq s (x :: s).
32593267
proof. 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+
32613279
lemma subseq_rcons (s : 'a list) x : subseq s (rcons s x).
32623280
proof. 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+
32643306
lemma rem_subseq x (s : 'a list) : subseq (rem x s) s.
32653307
proof.
32663308
elim: s => //= y s ih; rewrite eq_sym.

0 commit comments

Comments
 (0)