Commit e3040bdb authored by Simon Spies's avatar Simon Spies

Merge branch 'master' of https://gitlab.mpi-sws.org/iris/stdpp

parents 705bb406 0b3d1e9f
Pipeline #19183 failed with stage
in 0 seconds
This file lists "large-ish" changes to the std++ Coq library, but not every This file lists "large-ish" changes to the std++ Coq library, but not every
API-breaking change is listed. API-breaking change is listed.
## std++ 1.2.1 (unreleased)
This release of std++ received contributions by Michael Sammler, Paolo
G. Giarrusso, Paulo Emílio de Vilhena, Ralf Jung, Robbert Krebbers,
Rodolphe Lepigre, and Simon Spies.
Noteworthy additions and changes:
- Introduce `max` and `min` infix notations for `N` and `Z` like we have for `nat`.
- Make `solve_ndisj` tactic more powerful.
- Add type class `Involutive`.
- Improve `naive_solver` performance in case the goal is trivially solvable.
- Add a bunch of new lemmas for list, set, and map operations.
- Rename `lookup_imap` into `map_lookup_imap`.
## std++ 1.2.0 (released 2019-04-26) ## std++ 1.2.0 (released 2019-04-26)
Coq 8.9 is supported by this release, but Coq 8.6 is no longer supported. Use Coq 8.9 is supported by this release, but Coq 8.6 is no longer supported. Use
......
...@@ -94,6 +94,9 @@ Proof. unfold bool_decide. destruct dec; [left|right]; assumption. Qed. ...@@ -94,6 +94,9 @@ Proof. unfold bool_decide. destruct dec; [left|right]; assumption. Qed.
Lemma bool_decide_decide P `{!Decision P} : Lemma bool_decide_decide P `{!Decision P} :
bool_decide P = if decide P then true else false. bool_decide P = if decide P then true else false.
Proof. reflexivity. Qed. Proof. reflexivity. Qed.
Lemma decide_bool_decide P {Hdec: Decision P} {X : Type} (x1 x2 : X):
(if decide P then x1 else x2) = (if bool_decide P then x1 else x2).
Proof. unfold bool_decide, decide. destruct Hdec; reflexivity. Qed.
Tactic Notation "case_bool_decide" "as" ident (Hd) := Tactic Notation "case_bool_decide" "as" ident (Hd) :=
match goal with match goal with
......
...@@ -860,7 +860,7 @@ Proof. ...@@ -860,7 +860,7 @@ Proof.
Defined. Defined.
(** Properties of the imap function *) (** Properties of the imap function *)
Lemma lookup_imap {A B} (f : K A option B) (m : M A) i : Lemma map_lookup_imap {A B} (f : K A option B) (m : M A) i :
map_imap f m !! i = m !! i = f i. map_imap f m !! i = m !! i = f i.
Proof. Proof.
unfold map_imap; destruct (m !! i = f i) as [y|] eqn:Hi; simpl. unfold map_imap; destruct (m !! i = f i) as [y|] eqn:Hi; simpl.
...@@ -876,6 +876,39 @@ Proof. ...@@ -876,6 +876,39 @@ Proof.
rewrite elem_of_map_to_list in Hj; simplify_option_eq. rewrite elem_of_map_to_list in Hj; simplify_option_eq.
Qed. Qed.
Lemma map_imap_Some {A} (m : M A) : map_imap (λ _, Some) m = m.
Proof.
apply map_eq. intros i. rewrite map_lookup_imap. by destruct (m !! i).
Qed.
Lemma map_imap_insert {A B} (f : K A option B) (i : K) (v : A) (m : M A) :
map_imap f (<[i:=v]> m) = match f i v with
| None => delete i (map_imap f m)
| Some w => <[i:=w]> (map_imap f m)
end.
Proof.
destruct (f i v) as [w|] eqn:Hw.
- apply map_eq. intros k. rewrite map_lookup_imap.
destruct (decide (k = i)) as [->|Hk_not_i].
+ by rewrite lookup_insert, lookup_insert.
+ rewrite !lookup_insert_ne by done.
by rewrite map_lookup_imap.
- apply map_eq. intros k. rewrite map_lookup_imap.
destruct (decide (k = i)) as [->|Hk_not_i].
+ by rewrite lookup_insert, lookup_delete.
+ rewrite lookup_insert_ne, lookup_delete_ne by done.
by rewrite map_lookup_imap.
Qed.
Lemma map_imap_ext {A1 A2 B} (f1 : K A1 option B)
(f2 : K A2 option B) (m1 : M A1) (m2 : M A2) :
( k, f1 k <$> (m1 !! k) = f2 k <$> (m2 !! k))
map_imap f1 m1 = map_imap f2 m2.
Proof.
intros HExt. apply map_eq. intros i. rewrite !map_lookup_imap.
specialize (HExt i). destruct (m1 !! i), (m2 !! i); naive_solver.
Qed.
(** ** Properties of the size operation *) (** ** Properties of the size operation *)
Lemma map_size_empty {A} : size ( : M A) = 0. Lemma map_size_empty {A} : size ( : M A) = 0.
Proof. unfold size, map_size. by rewrite map_to_list_empty. Qed. Proof. unfold size, map_size. by rewrite map_to_list_empty. Qed.
...@@ -1081,13 +1114,18 @@ Section map_filter. ...@@ -1081,13 +1114,18 @@ Section map_filter.
naive_solver. naive_solver.
Qed. Qed.
Lemma map_filter_insert_not m i x : Lemma map_filter_insert_not' m i x :
( y, ¬ P (i, y)) filter P (<[i:=x]> m) = filter P m. ¬ P (i, x) ( y, m !! i = Some y ¬ P (i, y))
filter P (<[i:=x]> m) = filter P m.
Proof. Proof.
intros HP. apply map_filter_lookup_eq. intros j y Hy. intros Hx HP. apply map_filter_lookup_eq. intros j y Hy.
by rewrite lookup_insert_ne by naive_solver. rewrite lookup_insert_Some. naive_solver.
Qed. Qed.
Lemma map_filter_insert_not m i x :
( y, ¬ P (i, y)) filter P (<[i:=x]> m) = filter P m.
Proof. intros HP. by apply map_filter_insert_not'. Qed.
Lemma map_filter_delete m i : filter P (delete i m) = delete i (filter P m). Lemma map_filter_delete m i : filter P (delete i m) = delete i (filter P m).
Proof. Proof.
apply map_eq. intros j. apply option_eq; intros y. apply map_eq. intros j. apply option_eq; intros y.
...@@ -1106,6 +1144,16 @@ Section map_filter. ...@@ -1106,6 +1144,16 @@ Section map_filter.
Lemma map_filter_empty : filter P ( : M A) = . Lemma map_filter_empty : filter P ( : M A) = .
Proof. apply map_fold_empty. Qed. Proof. apply map_fold_empty. Qed.
Lemma map_filter_alt m : filter P m = list_to_map (filter P (map_to_list m)).
Proof.
apply list_to_map_flip. induction m as [|k x m ? IH] using map_ind.
{ by rewrite map_to_list_empty, map_filter_empty, map_to_list_empty. }
rewrite map_to_list_insert, filter_cons by done. destruct (decide (P _)).
- rewrite map_filter_insert by done.
by rewrite map_to_list_insert, IH by (rewrite map_filter_lookup_None; auto).
- by rewrite map_filter_insert_not' by naive_solver.
Qed.
End map_filter. End map_filter.
(** ** Properties of the [map_Forall] predicate *) (** ** Properties of the [map_Forall] predicate *)
......
...@@ -279,6 +279,13 @@ Section gset. ...@@ -279,6 +279,13 @@ Section gset.
- by rewrite option_guard_True by (rewrite elem_of_dom; eauto). - by rewrite option_guard_True by (rewrite elem_of_dom; eauto).
- by rewrite option_guard_False by (rewrite not_elem_of_dom; eauto). - by rewrite option_guard_False by (rewrite not_elem_of_dom; eauto).
Qed. Qed.
Lemma dom_gset_to_gmap {A} (X : gset K) (x : A) :
dom _ (gset_to_gmap x X) = X.
Proof.
induction X as [| y X not_in IH] using set_ind_L.
- rewrite gset_to_gmap_empty, dom_empty_L; done.
- rewrite gset_to_gmap_union_singleton, dom_insert_L, IH; done.
Qed.
End gset. End gset.
Typeclasses Opaque gset. Typeclasses Opaque gset.
This diff is collapsed.
...@@ -50,6 +50,26 @@ Inductive TlRel {A} (R : relation A) (a : A) : list A → Prop := ...@@ -50,6 +50,26 @@ Inductive TlRel {A} (R : relation A) (a : A) : list A → Prop :=
Section sorted. Section sorted.
Context {A} (R : relation A). Context {A} (R : relation A).
Lemma elem_of_StronglySorted_app l1 l2 x1 x2 :
StronglySorted R (l1 ++ l2) x1 l1 x2 l2 R x1 x2.
Proof.
induction l1 as [|x1' l1 IH]; simpl; [by rewrite elem_of_nil|].
intros [? Hall]%StronglySorted_inv [->|?]%elem_of_cons ?; [|by auto].
rewrite Forall_app, !Forall_forall in Hall. naive_solver.
Qed.
Lemma StronglySorted_app_inv_l l1 l2 :
StronglySorted R (l1 ++ l2) StronglySorted R l1.
Proof.
induction l1 as [|x1' l1 IH]; simpl;
[|inversion_clear 1]; decompose_Forall; constructor; auto.
Qed.
Lemma StronglySorted_app_inv_r l1 l2 :
StronglySorted R (l1 ++ l2) StronglySorted R l2.
Proof.
induction l1 as [|x1' l1 IH]; simpl;
[|inversion_clear 1]; decompose_Forall; auto.
Qed.
Lemma Sorted_StronglySorted `{!Transitive R} l : Lemma Sorted_StronglySorted `{!Transitive R} l :
Sorted R l StronglySorted R l. Sorted R l StronglySorted R l.
Proof. by apply Sorted.Sorted_StronglySorted. Qed. Proof. by apply Sorted.Sorted_StronglySorted. Qed.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment