diff options
Diffstat (limited to 'theories/upstream.v')
| -rw-r--r-- | theories/upstream.v | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/theories/upstream.v b/theories/upstream.v new file mode 100644 index 0000000..b74add5 --- /dev/null +++ b/theories/upstream.v | |||
| @@ -0,0 +1,60 @@ | |||
| 1 | From stdpp Require Import prelude ssreflect gmultiset. | ||
| 2 | From stdpp Require Import options. | ||
| 3 | |||
| 4 | Lemma prefix_of_fmap {A B} (f : A → B) (xs xs' : list A) : | ||
| 5 | xs `prefix_of` xs' → | ||
| 6 | f <$> xs `prefix_of` f <$> xs'. | ||
| 7 | Proof. intros [ys ->]. exists (f <$> ys). apply fmap_app. Qed. | ||
| 8 | |||
| 9 | Lemma prefix_sublist {A} (l1 l2 : list A) : l1 `prefix_of` l2 → l1 `sublist_of` l2. | ||
| 10 | Proof. intros [k ->]. by apply sublist_inserts_r. Qed. | ||
| 11 | |||
| 12 | Lemma prefix_submseteq {A} (l1 l2 : list A) : l1 `prefix_of` l2 → l1 ⊆+ l2. | ||
| 13 | Proof. intros [k ->]. by apply submseteq_inserts_r. Qed. | ||
| 14 | |||
| 15 | Lemma take_less_prefix {A} n m (xs : list A) : n ≤ m → take n xs `prefix_of` take m xs. | ||
| 16 | Proof. | ||
| 17 | intros Hnm. | ||
| 18 | replace n with (n `min` m); last lia. | ||
| 19 | rewrite -take_take. | ||
| 20 | apply prefix_take. | ||
| 21 | Qed. | ||
| 22 | |||
| 23 | Lemma take_app_prefix {A} n (xs ys : list A) : take n xs `prefix_of` take n (xs ++ ys). | ||
| 24 | Proof. unfold prefix. exists (take (n - length xs) ys). apply firstn_app. Qed. | ||
| 25 | |||
| 26 | Lemma Forall_prefix {A} (xs xs' : list A) Φ : xs `prefix_of` xs' → Forall Φ xs' → Forall Φ xs. | ||
| 27 | Proof. by intros [? ->] [? _]%Forall_app. Qed. | ||
| 28 | |||
| 29 | Lemma drop_cons_inv {A} n x (xs xs' : list A) : | ||
| 30 | drop n xs = x :: xs' → xs !! n = Some x ∧ drop (S n) xs = xs'. | ||
| 31 | Proof. | ||
| 32 | intros Hxs. split. | ||
| 33 | - by rewrite -[n]Nat.add_0_r -lookup_drop Hxs. | ||
| 34 | - by rewrite -Nat.add_1_r -drop_drop Hxs. | ||
| 35 | Qed. | ||
| 36 | |||
| 37 | Lemma list_to_set_disj_size `{Countable A} (l : list A) : | ||
| 38 | size (list_to_set_disj l : gmultiset A) = length l. | ||
| 39 | Proof. | ||
| 40 | induction l; first done. | ||
| 41 | by rewrite /= gmultiset_size_disj_union IHl gmultiset_size_singleton. | ||
| 42 | Qed. | ||
| 43 | |||
| 44 | Lemma gmultiset_subseteq_size_eq `{Countable A, LeibnizEquiv A} (X Y : gmultiset A) : | ||
| 45 | X ⊆ Y → size Y ≤ size X → X = Y. | ||
| 46 | Proof. | ||
| 47 | revert Y. induction X using gmultiset_ind; intros Y HY Hsize. | ||
| 48 | - rewrite gmultiset_size_empty in Hsize. | ||
| 49 | apply symmetry, gmultiset_size_empty_inv. lia. | ||
| 50 | - rewrite gmultiset_size_disj_union gmultiset_size_singleton in Hsize. | ||
| 51 | assert (X ⊆ Y ∖ {[+ x +]}) as HXY%IHX; [multiset_solver..|]. | ||
| 52 | rewrite gmultiset_size_difference; last multiset_solver. | ||
| 53 | rewrite gmultiset_size_singleton. lia. | ||
| 54 | Qed. | ||
| 55 | |||
| 56 | Lemma elements_list_to_set_disj_perm `{Countable A} (l : list A) : l ≡ₚ elements (list_to_set_disj l : gmultiset A). | ||
| 57 | Proof. | ||
| 58 | induction l; first done. | ||
| 59 | by rewrite list_to_set_disj_cons gmultiset_elements_disj_union gmultiset_elements_singleton -IHl. | ||
| 60 | Qed. | ||