Skip to content
Snippets Groups Projects
Commit 8ed74c3a authored by Hai Dang's avatar Hai Dang
Browse files

simplify proofs of gmap filter

parent bc61b7a5
No related branches found
No related tags found
1 merge request!6Add filter for gmap
...@@ -254,15 +254,8 @@ Section filter. ...@@ -254,15 +254,8 @@ Section filter.
m k, m k,
filter P m !! k = None m !! k = None v, m !! k = Some v ¬ P (k,v). filter P m !! k = None m !! k = None v, m !! k = Some v ¬ P (k,v).
Proof. Proof.
apply (map_fold_ind (λ m1 m2, k, m1 !! k = None intros m k. rewrite eq_None_not_Some. unfold is_Some.
(m2 !! k = None v, m2 !! k = Some v ¬ P _))). setoid_rewrite gmap_filter_lookup_Some. naive_solver.
- naive_solver.
- intros k v m m' Hm Eq k'.
case_match; case (decide (k' = k)) as [->|?].
+ rewrite 2!lookup_insert. naive_solver.
+ do 2 (rewrite lookup_insert_ne; [|auto]). by apply Eq.
+ rewrite Eq, Hm, lookup_insert. naive_solver.
+ by rewrite lookup_insert_ne.
Qed. Qed.
Lemma gmap_filter_dom m: Lemma gmap_filter_dom m:
...@@ -272,51 +265,37 @@ Section filter. ...@@ -272,51 +265,37 @@ Section filter.
destruct 1 as [?[Eq _]%gmap_filter_lookup_Some]. by eexists. destruct 1 as [?[Eq _]%gmap_filter_lookup_Some]. by eexists.
Qed. Qed.
Lemma gmap_filter_lookup_equiv `{Equiv A} `{Reflexive A ()} m1 m2: Lemma gmap_filter_lookup_equiv m1 m2:
( k v, P (k,v) m1 !! k = Some v m2 !! k = Some v) ( k v, P (k,v) m1 !! k = Some v m2 !! k = Some v)
filter P m1 filter P m2. filter P m1 = filter P m2.
Proof. Proof.
intros HP k. intros HP. apply map_eq. intros k.
destruct (filter P m1 !! k) as [v1|] eqn:Hv1; destruct (filter P m2 !! k) as [v2|] eqn:Hv2;
[apply gmap_filter_lookup_Some in Hv1 as [Hv1 HP1]; [apply gmap_filter_lookup_Some in Hv2 as [Hv2 HP2];
specialize (HP k v1 HP1)|]; specialize (HP k v2 HP2)
destruct (filter P m2 !! k) as [v2|] eqn: Hv2. |apply gmap_filter_lookup_None; right; intros v EqS ISP;
- apply gmap_filter_lookup_Some in Hv2 as [Hv2 _]. apply gmap_filter_lookup_None in Hv2 as [Hv2|Hv2]].
rewrite Hv1, Hv2 in HP. destruct HP as [HP _]. - apply gmap_filter_lookup_Some. by rewrite HP.
specialize (HP (eq_refl _)) as []. by apply option_Forall2_refl. - specialize (HP _ _ ISP). rewrite HP, Hv2 in EqS. naive_solver.
- apply gmap_filter_lookup_None in Hv2 as [Hv2|Hv2]; - apply (Hv2 v); [by apply HP|done].
[naive_solver|by apply HP, Hv2 in Hv1].
- apply gmap_filter_lookup_Some in Hv2 as [Hv2 HP2].
specialize (HP k v2 HP2).
apply gmap_filter_lookup_None in Hv1 as [Hv1|Hv1].
+ rewrite Hv1 in HP. naive_solver.
+ by apply HP, Hv1 in Hv2.
- by apply option_Forall2_refl.
Qed. Qed.
Lemma gmap_filter_lookup_insert `{Equiv A} `{Reflexive A ()} m k v: Lemma gmap_filter_lookup_insert m k v:
P (k,v) <[k := v]> (filter P m) filter P (<[k := v]> m). P (k,v) <[k := v]> (filter P m) = filter P (<[k := v]> m).
Proof. Proof.
intros HP k'. intros HP. apply map_eq. intros k'.
case (decide (k' = k)) as [->|?]; case (decide (k' = k)) as [->|?];
[rewrite lookup_insert|rewrite lookup_insert_ne; [|auto]]. [rewrite lookup_insert|rewrite lookup_insert_ne; [|auto]].
- destruct (filter P (<[k:=v]> m) !! k) eqn: Hk. - symmetry. apply gmap_filter_lookup_Some. by rewrite lookup_insert.
+ apply gmap_filter_lookup_Some in Hk.
rewrite lookup_insert in Hk. destruct Hk as [Hk _].
inversion Hk. by apply option_Forall2_refl.
+ apply gmap_filter_lookup_None in Hk.
rewrite lookup_insert in Hk.
destruct Hk as [->|HNP]. by apply option_Forall2_refl.
by specialize (HNP v (eq_refl _)).
- destruct (filter P (<[k:=v]> m) !! k') eqn: Hk; revert Hk; - destruct (filter P (<[k:=v]> m) !! k') eqn: Hk; revert Hk;
[rewrite gmap_filter_lookup_Some|rewrite gmap_filter_lookup_None]; [rewrite gmap_filter_lookup_Some, lookup_insert_ne; [|by auto];
(rewrite lookup_insert_ne ; [|by auto]); by rewrite <-gmap_filter_lookup_Some
[rewrite <-gmap_filter_lookup_Some|rewrite <-gmap_filter_lookup_None]; |rewrite gmap_filter_lookup_None, lookup_insert_ne; [|auto];
intros Hk; rewrite Hk; by apply option_Forall2_refl. by rewrite <-gmap_filter_lookup_None].
Qed. Qed.
Lemma gmap_filter_empty `{Equiv A} : filter P ( : gmap K A) ∅. Lemma gmap_filter_empty `{Equiv A} : filter P ( : gmap K A) = ∅.
Proof. intro l. rewrite lookup_empty. constructor. Qed. Proof. apply map_fold_empty. Qed.
End filter. End filter.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment