summaryrefslogtreecommitdiffstats
path: root/theories/upstream.v
diff options
context:
space:
mode:
Diffstat (limited to 'theories/upstream.v')
-rw-r--r--theories/upstream.v60
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 @@
1From stdpp Require Import prelude ssreflect gmultiset.
2From stdpp Require Import options.
3
4Lemma prefix_of_fmap {A B} (f : A → B) (xs xs' : list A) :
5 xs `prefix_of` xs' →
6 f <$> xs `prefix_of` f <$> xs'.
7Proof. intros [ys ->]. exists (f <$> ys). apply fmap_app. Qed.
8
9Lemma prefix_sublist {A} (l1 l2 : list A) : l1 `prefix_of` l2 → l1 `sublist_of` l2.
10Proof. intros [k ->]. by apply sublist_inserts_r. Qed.
11
12Lemma prefix_submseteq {A} (l1 l2 : list A) : l1 `prefix_of` l2 → l1 ⊆+ l2.
13Proof. intros [k ->]. by apply submseteq_inserts_r. Qed.
14
15Lemma take_less_prefix {A} n m (xs : list A) : n ≤ m → take n xs `prefix_of` take m xs.
16Proof.
17 intros Hnm.
18 replace n with (n `min` m); last lia.
19 rewrite -take_take.
20 apply prefix_take.
21Qed.
22
23Lemma take_app_prefix {A} n (xs ys : list A) : take n xs `prefix_of` take n (xs ++ ys).
24Proof. unfold prefix. exists (take (n - length xs) ys). apply firstn_app. Qed.
25
26Lemma Forall_prefix {A} (xs xs' : list A) Φ : xs `prefix_of` xs' → Forall Φ xs' → Forall Φ xs.
27Proof. by intros [? ->] [? _]%Forall_app. Qed.
28
29Lemma 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'.
31Proof.
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.
35Qed.
36
37Lemma list_to_set_disj_size `{Countable A} (l : list A) :
38 size (list_to_set_disj l : gmultiset A) = length l.
39Proof.
40 induction l; first done.
41 by rewrite /= gmultiset_size_disj_union IHl gmultiset_size_singleton.
42Qed.
43
44Lemma gmultiset_subseteq_size_eq `{Countable A, LeibnizEquiv A} (X Y : gmultiset A) :
45 X ⊆ Y → size Y ≤ size X → X = Y.
46Proof.
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.
54Qed.
55
56Lemma elements_list_to_set_disj_perm `{Countable A} (l : list A) : l ≡ₚ elements (list_to_set_disj l : gmultiset A).
57Proof.
58 induction l; first done.
59 by rewrite list_to_set_disj_cons gmultiset_elements_disj_union gmultiset_elements_singleton -IHl.
60Qed.