Skip to content
Snippets Groups Projects
Verified Commit 9044ada3 authored by Dorian Lesbre's avatar Dorian Lesbre
Browse files

Change styling

parent 99081ea8
Branches
Tags
1 merge request!444Add images (codomains) to finite maps
...@@ -14,28 +14,28 @@ Class FinMapImg K A M D ...@@ -14,28 +14,28 @@ Class FinMapImg K A M D
Union D, Intersection D, Difference D} := { Union D, Intersection D, Difference D} := {
finmap_img_map :> FinMap K M; finmap_img_map :> FinMap K M;
finmap_img_set :> Set_ A D; finmap_img_set :> Set_ A D;
elem_of_img (m:M A) (v:A) : v img m <-> (k:K), m !! k = Some v elem_of_img (m : M A) (v : A) : v img m (k : K), m !! k = Some v
}. }.
Section fin_map_img. Section fin_map_img.
Context `{FinMapImg K A M D}. Context `{FinMapImg K A M D}.
Implicit Types (m:M A) (k:K) (v:A). Implicit Types (m : M A) (k : K) (v : A).
(* avoid writing ≡@{D} everywhere... *) (* avoid writing ≡@{D} everywhere... *)
Infix "≡" := (@equiv D _) (at level 70). Infix "≡" := (@equiv D _) (at level 70).
Lemma elem_of_img_2 m k v: m !! k = Some v -> v img m. Lemma elem_of_img_2 m k v : m !! k = Some v v img m.
Proof. intros Hmkv. rewrite elem_of_img. exists k. exact Hmkv. Qed. Proof. intros Hmkv. rewrite elem_of_img. exists k. exact Hmkv. Qed.
Lemma not_elem_of_img m v: v img m <-> k, m !! k Some v. Lemma not_elem_of_img m v : v img m k, m !! k Some v.
Proof. rewrite elem_of_img. split. Proof. rewrite elem_of_img. split.
- intros Hm k Hk. contradiction (Hm (ex_intro _ k Hk)). - intros Hm k Hk. contradiction (Hm (ex_intro _ k Hk)).
- intros Hm [k Hk]. contradiction (Hm k Hk). - intros Hm [k Hk]. contradiction (Hm k Hk).
Qed. Qed.
Lemma not_elem_of_img_1 m v k: v img m -> m !! k Some v. Lemma not_elem_of_img_1 m v k : v img m m !! k Some v.
Proof. intros Hm. apply not_elem_of_img. exact Hm. Qed. Proof. intros Hm. apply not_elem_of_img. exact Hm. Qed.
Lemma subseteq_img (m1 m2:M A): m1 m2 -> img m1 img m2. Lemma subseteq_img (m1 m2 : M A) : m1 m2 img m1 img m2.
Proof. Proof.
intros Hm v Hv. rewrite elem_of_img. intros Hm v Hv. rewrite elem_of_img.
apply elem_of_img in Hv as [k Hv]. exists k. apply elem_of_img in Hv as [k Hv]. exists k.
...@@ -43,25 +43,25 @@ Section fin_map_img. ...@@ -43,25 +43,25 @@ Section fin_map_img.
apply (Hm k v Hv). apply (Hm k v Hv).
Qed. Qed.
Lemma img_filter (P : K * A Prop) `{!∀ x, Decision (P x)} m (X:D): Lemma img_filter (P : K * A Prop) `{!∀ x, Decision (P x)} m (X : D) :
( v, v X k, m !! k = Some v P (k, v)) ( v, v X k, m !! k = Some v P (k, v))
img (filter P m) X. img (filter P m) X.
Proof. Proof.
intros HX i. rewrite elem_of_img, HX. intros HX i. rewrite elem_of_img, HX.
unfold is_Some. by setoid_rewrite map_filter_lookup_Some. unfold is_Some. by setoid_rewrite map_filter_lookup_Some.
Qed. Qed.
Lemma img_filter_subseteq (P : K * A Prop) `{!∀ x, Decision (P x)} m: Lemma img_filter_subseteq (P : K * A Prop) `{!∀ x, Decision (P x)} m :
img (filter P m) img m. img (filter P m) img m.
Proof. apply subseteq_img, map_filter_subseteq. Qed. Proof. apply subseteq_img, map_filter_subseteq. Qed.
Lemma img_empty: img ( : M A) ∅. Lemma img_empty : img ( : M A) ∅.
Proof. Proof.
rewrite set_equiv. intros x. split; intros Hempty. rewrite set_equiv. intros x. split; intros Hempty.
- apply elem_of_img in Hempty. destruct Hempty as [k Hk]. - apply elem_of_img in Hempty. destruct Hempty as [k Hk].
rewrite lookup_empty in Hk. discriminate. rewrite lookup_empty in Hk. discriminate.
- rewrite elem_of_empty in Hempty. contradiction Hempty. - rewrite elem_of_empty in Hempty. contradiction Hempty.
Qed. Qed.
Lemma img_empty_iff m: img m m = ∅. Lemma img_empty_iff m : img m m = ∅.
Proof. Proof.
split; [|intros ->; by rewrite img_empty]. split; [|intros ->; by rewrite img_empty].
intros E. apply map_empty. intros i. intros E. apply map_empty. intros i.
...@@ -69,26 +69,26 @@ Section fin_map_img. ...@@ -69,26 +69,26 @@ Section fin_map_img.
- apply elem_of_img_2 in Hm. set_solver. - apply elem_of_img_2 in Hm. set_solver.
- reflexivity. - reflexivity.
Qed. Qed.
Lemma img_empty_inv m: img m m = ∅. Lemma img_empty_inv m : img m m = ∅.
Proof. apply img_empty_iff. Qed. Proof. apply img_empty_iff. Qed.
Lemma img_insert k v m: img (<[k:=v]> m) {[ v ]} img m. Lemma img_insert k v m : img (<[k:=v]> m) {[ v ]} img m.
Proof. Proof.
intros w Hw. apply elem_of_img in Hw as [k' Hw]. intros w Hw. apply elem_of_img in Hw as [k' Hw].
apply lookup_insert_Some in Hw as [[Hkk' Hvw] | [Hkk' Hmk']]. apply lookup_insert_Some in Hw as [[Hkk' Hvw] | [Hkk' Hmk']].
- apply elem_of_union_l, elem_of_singleton. symmetry. apply Hvw. - apply elem_of_union_l, elem_of_singleton. symmetry. apply Hvw.
- apply elem_of_union_r, elem_of_img. exists k'. apply Hmk'. - apply elem_of_union_r, elem_of_img. exists k'. apply Hmk'.
Qed. Qed.
Lemma elem_of_img_insert k v m: v img (<[k:=v]> m). Lemma elem_of_img_insert k v m : v img (<[k:=v]> m).
Proof. apply elem_of_img. exists k. apply lookup_insert. Qed. Proof. apply elem_of_img. exists k. apply lookup_insert. Qed.
Lemma elem_of_img_insert_ne k v w m: v w -> w img(<[k:=v]> m) -> w img m. Lemma elem_of_img_insert_ne k v w m : v w w img(<[k:=v]> m) w img m.
Proof. rewrite !elem_of_img. intros Hv [k' Hk]. Proof. rewrite !elem_of_img. intros Hv [k' Hk].
destruct (decide (k=k')) as [Heq|Heq]. destruct (decide (k=k')) as [Heq|Heq].
- rewrite Heq, lookup_insert in Hk. - rewrite Heq, lookup_insert in Hk.
apply Some_inj in Hk. contradiction (Hv Hk). apply Some_inj in Hk. contradiction (Hv Hk).
- rewrite (lookup_insert_ne _ _ _ _ Heq) in Hk. exists k'. exact Hk. - rewrite (lookup_insert_ne _ _ _ _ Heq) in Hk. exists k'. exact Hk.
Qed. Qed.
Lemma img_insert_notin k v m: m!!k = None -> img (<[k:=v]> m) {[ v ]} img m. Lemma img_insert_notin k v m : m!!k = None img (<[k:=v]> m) {[ v ]} img m.
Proof. Proof.
intros Hm w. rewrite elem_of_union, !elem_of_img, elem_of_singleton. intros Hm w. rewrite elem_of_union, !elem_of_img, elem_of_singleton.
setoid_rewrite lookup_insert_Some. setoid_rewrite lookup_insert_Some.
...@@ -105,9 +105,9 @@ Section fin_map_img. ...@@ -105,9 +105,9 @@ Section fin_map_img.
setoid_rewrite lookup_singleton_Some. set_solver. setoid_rewrite lookup_singleton_Some. set_solver.
Qed. Qed.
Lemma elem_of_img_union m1 m2 v: Lemma elem_of_img_union m1 m2 v :
v img (m1 m2) -> v img (m1 m2)
v img m1 \/ v img m2. v img m1 v img m2.
Proof. Proof.
intros Hv12. intros Hv12.
(* destruct (elem_of_img (m1 ∪ m2) v) as . *) (* destruct (elem_of_img (m1 ∪ m2) v) as . *)
...@@ -117,9 +117,9 @@ Section fin_map_img. ...@@ -117,9 +117,9 @@ Section fin_map_img.
destruct (Hspec Hv12) as [Hm | [_ Hm]]; destruct (Hspec Hv12) as [Hm | [_ Hm]];
[ left | right ]; rewrite elem_of_img; exists k; exact Hm. [ left | right ]; rewrite elem_of_img; exists k; exact Hm.
Qed. Qed.
Lemma img_union_subseteq m1 m2: img (m1 m2) img m1 img m2. Lemma img_union_subseteq m1 m2 : img (m1 m2) img m1 img m2.
Proof. intros v Hv. apply elem_of_union, elem_of_img_union. exact Hv. Qed. Proof. intros v Hv. apply elem_of_union, elem_of_img_union. exact Hv. Qed.
Lemma img_union_subseteq_l m1 m2: img m1 img (m1 m2). Lemma img_union_subseteq_l m1 m2 : img m1 img (m1 m2).
Proof. Proof.
intros v Hv. apply elem_of_img in Hv as [k Hv]. intros v Hv. apply elem_of_img in Hv as [k Hv].
rewrite elem_of_img. rewrite elem_of_img.
...@@ -127,7 +127,7 @@ Section fin_map_img. ...@@ -127,7 +127,7 @@ Section fin_map_img.
Qed. Qed.
Lemma img_fmap `{Img (M B) D2, ElemOf B D2, Empty D2, Singleton B D2, Union D2, Intersection D2, Difference D2, !FinMapImg K B M D2} Lemma img_fmap `{Img (M B) D2, ElemOf B D2, Empty D2, Singleton B D2, Union D2, Intersection D2, Difference D2, !FinMapImg K B M D2}
`{Elements A D, EqDecision A, !FinSet A D} (f: A -> B) m: `{Elements A D, EqDecision A, !FinSet A D} (f : A B) m :
img (f <$> m) ≡@{D2} set_map f (img m). img (f <$> m) ≡@{D2} set_map f (img m).
Proof. Proof.
apply set_equiv. intros v. rewrite elem_of_img, elem_of_map. split. apply set_equiv. intros v. rewrite elem_of_img, elem_of_map. split.
...@@ -141,7 +141,7 @@ Section fin_map_img. ...@@ -141,7 +141,7 @@ Section fin_map_img.
Qed. Qed.
Lemma img_kmap `{Img (M2 A) D, FinMap K2 M2, !FinMapImg K2 A M2 D} Lemma img_kmap `{Img (M2 A) D, FinMap K2 M2, !FinMapImg K2 A M2 D}
(f: K -> K2) `{!Inj (=) (=) f} m: (f : K K2) `{!Inj (=) (=) f} m :
img (kmap (M2:=M2) f m) img m. img (kmap (M2:=M2) f m) img m.
Proof. Proof.
apply set_equiv. intros v. apply set_equiv. intros v.
...@@ -150,7 +150,7 @@ Section fin_map_img. ...@@ -150,7 +150,7 @@ Section fin_map_img.
- exists (f k). rewrite lookup_kmap; done. - exists (f k). rewrite lookup_kmap; done.
Qed. Qed.
Lemma img_finite m: set_finite (img m). Lemma img_finite m : set_finite (img m).
Proof. Proof.
induction m as [|x i m Hm IHm] using map_ind . induction m as [|x i m Hm IHm] using map_ind .
- rewrite img_empty. apply empty_finite. - rewrite img_empty. apply empty_finite.
...@@ -158,18 +158,18 @@ Section fin_map_img. ...@@ -158,18 +158,18 @@ Section fin_map_img.
apply union_finite; [ apply singleton_finite | apply IHm ]. apply union_finite; [ apply singleton_finite | apply IHm ].
Qed. Qed.
Lemma img_list_to_map l: Lemma img_list_to_map l :
( k v v', (k,v) l -> (k,v') l -> v = v') -> ( k v v', (k,v) l (k,v') l v = v')
img (list_to_map l : M A) list_to_set l.*2. img (list_to_map l : M A) list_to_set l.*2.
Proof. Proof.
induction l as [|a l IH]. induction l as [|a l IH].
- by rewrite img_empty. - by rewrite img_empty.
- intros Hl. destruct a as [k v]. simpl. - intros Hl. destruct a as [k v]. simpl.
assert (IH': img (list_to_map l: M A) list_to_set l.*2). assert (IH' : img (list_to_map l : M A) list_to_set l.*2).
{ apply IH. intros k' v' v'' Hv' Hv''. apply (Hl k' v' v''); apply elem_of_list_further; assumption. } { apply IH. intros k' v' v'' Hv' Hv''. apply (Hl k' v' v''); apply elem_of_list_further; assumption. }
rewrite <- IH'. rewrite <- IH'.
destruct ((list_to_map l : M A)!!k) as [w|] eqn:Hw. destruct ((list_to_map l : M A)!!k) as [w|] eqn:Hw.
+ assert (Hvw: v = w). + assert (Hvw : v = w).
{ apply (Hl k); [ apply elem_of_list_here | apply elem_of_list_further ]. { apply (Hl k); [ apply elem_of_list_here | apply elem_of_list_further ].
apply elem_of_list_to_map_2. exact Hw. } apply elem_of_list_to_map_2. exact Hw. }
rewrite <- Hvw in Hw. apply set_equiv. intros x. split. rewrite <- Hvw in Hw. apply set_equiv. intros x. split.
...@@ -183,7 +183,7 @@ Section fin_map_img. ...@@ -183,7 +183,7 @@ Section fin_map_img.
Qed. Qed.
(** Alternative definition of [img] in terms of [map_to_list]. *) (** Alternative definition of [img] in terms of [map_to_list]. *)
Lemma img_alt m: img m list_to_set (map_to_list m).*2. Lemma img_alt m : img m list_to_set (map_to_list m).*2.
Proof. Proof.
rewrite <-(list_to_map_to_list m) at 1. rewrite <-(list_to_map_to_list m) at 1.
rewrite img_list_to_map; [reflexivity|]. rewrite img_list_to_map; [reflexivity|].
...@@ -191,8 +191,8 @@ Section fin_map_img. ...@@ -191,8 +191,8 @@ Section fin_map_img.
rewrite Hv in Hv'. apply Some_inj. exact Hv'. rewrite Hv in Hv'. apply Some_inj. exact Hv'.
Qed. Qed.
Lemma img_singleton_inv m v: Lemma img_singleton_inv m v :
img m {[ v ]} -> k, m !! k = None \/ m !! k = Some v. img m {[ v ]} k, m !! k = None m !! k = Some v.
Proof. Proof.
intros Hm k. destruct (m!!k) eqn:Hmk. intros Hm k. destruct (m!!k) eqn:Hmk.
- right. apply elem_of_img_2 in Hmk. rewrite Hm, elem_of_singleton in Hmk. - right. apply elem_of_img_2 in Hmk. rewrite Hm, elem_of_singleton in Hmk.
...@@ -200,14 +200,14 @@ Section fin_map_img. ...@@ -200,14 +200,14 @@ Section fin_map_img.
- left. reflexivity. - left. reflexivity.
Qed. Qed.
Lemma img_union_inv `{!RelDecision (∈@{D})} X Y m: Lemma img_union_inv `{!RelDecision (∈@{D})} X Y m :
X ## Y -> X ## Y
img m X Y -> img m X Y
m1 m2, m = m1 m2 /\ m1 ## m2 /\ img m1 X /\ img m2 Y. m1 m2, m = m1 m2 m1 ## m2 img m1 X img m2 Y.
Proof. Proof.
intros Hsep Himg. intros Hsep Himg.
exists (filter (λ '(_,x), x X) m), (filter (λ '(_,x), x X) m). exists (filter (λ '(_,x), x X) m), (filter (λ '(_,x), x X) m).
assert (Hdisj: filter (λ '(_, x), x X) m ## filter (λ '(_, x), x X) m). assert (Hdisj : filter (λ '(_, x), x X) m ## filter (λ '(_, x), x X) m).
{ apply map_disjoint_filter_complement. } { apply map_disjoint_filter_complement. }
split_and!. split_and!.
- symmetry. apply map_filter_union_complement. - symmetry. apply map_filter_union_complement.
...@@ -226,46 +226,46 @@ Section fin_map_img. ...@@ -226,46 +226,46 @@ Section fin_map_img.
Section Leibniz. Section Leibniz.
Context `{!LeibnizEquiv D}. Context `{!LeibnizEquiv D}.
Lemma img_empty_L: img (@empty (M A) _) = ∅. Lemma img_empty_L : img (@empty (M A) _) = ∅.
Proof. unfold_leibniz. exact img_empty. Qed. Proof. unfold_leibniz. exact img_empty. Qed.
Lemma img_empty_iff_L m: img m = m = ∅. Lemma img_empty_iff_L m : img m = m = ∅.
Proof. unfold_leibniz. apply img_empty_iff. Qed. Proof. unfold_leibniz. apply img_empty_iff. Qed.
Lemma img_empty_inv_L m: img m = m = ∅. Lemma img_empty_inv_L m : img m = m = ∅.
Proof. apply img_empty_iff_L. Qed. Proof. apply img_empty_iff_L. Qed.
Lemma img_singleton_L k v: img ({[ k := v ]} : M A) = {[ v ]}. Lemma img_singleton_L k v : img ({[ k := v ]} : M A) = {[ v ]}.
Proof. unfold_leibniz. apply img_singleton. Qed. Proof. unfold_leibniz. apply img_singleton. Qed.
Lemma img_insert_notin_L k v m: m!!k=None -> img (<[k:=v]> m) = {[ v ]} img m. Lemma img_insert_notin_L k v m : m!!k=None img (<[k:=v]> m) = {[ v ]} img m.
Proof. unfold_leibniz. apply img_insert_notin. Qed. Proof. unfold_leibniz. apply img_insert_notin. Qed.
Lemma img_fmap_L `{Img (M B) D2, ElemOf B D2, Empty D2, Singleton B D2, Union D2, Intersection D2, Difference D2, !FinMapImg K B M D2} Lemma img_fmap_L `{Img (M B) D2, ElemOf B D2, Empty D2, Singleton B D2, Union D2, Intersection D2, Difference D2, !FinMapImg K B M D2}
`{Elements A D, EqDecision A, !FinSet A D, !LeibnizEquiv D2} (f: A -> B) m: `{Elements A D, EqDecision A, !FinSet A D, !LeibnizEquiv D2} (f : A B) m :
img (f <$> m) = set_map f (img m). img (f <$> m) = set_map f (img m).
Proof. unfold_leibniz. apply img_fmap. Qed. Proof. unfold_leibniz. apply img_fmap. Qed.
Lemma img_kmap_L `{Img (M2 A) D, FinMap K2 M2, !FinMapImg K2 A M2 D} Lemma img_kmap_L `{Img (M2 A) D, FinMap K2 M2, !FinMapImg K2 A M2 D}
(f: K -> K2) `{!Inj (=) (=) f} m: (f : K K2) `{!Inj (=) (=) f} m :
img (kmap (M2:=M2) f m) = img m. img (kmap (M2:=M2) f m) = img m.
Proof. unfold_leibniz. apply img_kmap. done. Qed. Proof. unfold_leibniz. apply img_kmap. done. Qed.
Lemma img_list_to_map_L l: Lemma img_list_to_map_L l :
( k v v', (k,v) l -> (k,v') l -> v = v') -> ( k v v', (k,v) l (k,v') l v = v')
img (list_to_map l : M A) = list_to_set l.*2. img (list_to_map l : M A) = list_to_set l.*2.
Proof. unfold_leibniz. apply img_list_to_map. Qed. Proof. unfold_leibniz. apply img_list_to_map. Qed.
Lemma img_alt_L m: img m = list_to_set (map_to_list m).*2. Lemma img_alt_L m : img m = list_to_set (map_to_list m).*2.
Proof. unfold_leibniz. apply img_alt. Qed. Proof. unfold_leibniz. apply img_alt. Qed.
Lemma img_singleton_inv_L m v: Lemma img_singleton_inv_L m v :
img m = {[ v ]} -> k, m !! k = None \/ m !! k = Some v. img m = {[ v ]} k, m !! k = None m !! k = Some v.
Proof. unfold_leibniz. apply img_singleton_inv. Qed. Proof. unfold_leibniz. apply img_singleton_inv. Qed.
Lemma img_union_inv_L `{!RelDecision (∈@{D})} X Y m: Lemma img_union_inv_L `{!RelDecision (∈@{D})} X Y m :
X ## Y -> X ## Y
img m = X Y -> img m = X Y
m1 m2, m = m1 m2 /\ m1 ## m2 /\ img m1 = X /\ img m2 = Y. m1 m2, m = m1 m2 m1 ## m2 img m1 = X img m2 = Y.
Proof. unfold_leibniz. apply img_union_inv. Qed. Proof. unfold_leibniz. apply img_union_inv. Qed.
End Leibniz. End Leibniz.
...@@ -279,7 +279,7 @@ Global Instance fin_map_img K A M D ...@@ -279,7 +279,7 @@ Global Instance fin_map_img K A M D
: Img M D := map_to_set (fun _ a => a). : Img M D := map_to_set (fun _ a => a).
Global Instance fin_map_img_spec K A M D Global Instance fin_map_img_spec K A M D
`{HFinMap:FinMap K M} `{HFinSet:FinSet A D} : FinMapImg K A M D. `{HFinMap : FinMap K M} `{HFinSet : FinSet A D} : FinMapImg K A M D.
Proof. Proof.
split; [exact HFinMap | apply fin_set_set |]. split; [exact HFinMap | apply fin_set_set |].
unfold img, fin_map_img. intros m v. rewrite elem_of_map_to_set. split. unfold img, fin_map_img. intros m v. rewrite elem_of_map_to_set. split.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment