diff --git a/prelude/gmap.v b/prelude/gmap.v index 917bfb29e0867c3debf6bcb3eb74f5985fb0339a..1c2cd5ec7865d8fb95e8b64bfb27d7443543f975 100644 --- a/prelude/gmap.v +++ b/prelude/gmap.v @@ -118,19 +118,16 @@ Instance gset_dom `{Countable K} {A} : Dom (gmap K A) (gset K) := mapset_dom. Instance gset_dom_spec `{Countable K} : FinMapDom K (gmap K) (gset K) := mapset_dom_spec. -(** * Fresh positive *) -Definition Gfresh {A} (m : gmap positive A) : positive := - Pfresh $ gmap_car m. -Lemma Gfresh_fresh {A} (m : gmap positive A) : m !! Gfresh m = None. -Proof. destruct m as [[]]. apply Pfresh_fresh; done. Qed. - -Instance Gset_fresh : Fresh positive (gset positive) := λ X, - let (m) := X in Gfresh m. -Instance Gset_fresh_spec : FreshSpec positive (gset positive). +(** * Fresh elements *) +(* This is pretty ad-hoc and just for the case of [gset positive]. We need a +notion of countable non-finite types to generalize this. *) +Instance gset_positive_fresh : Fresh positive (gset positive) := λ X, + let 'Mapset (GMap m _) := X in fresh (dom _ m). +Instance gset_positive_fresh_spec : FreshSpec positive (gset positive). Proof. split. * apply _. - * intros X Y; rewrite <-elem_of_equiv_L. by intros ->. - * unfold elem_of, mapset_elem_of, fresh; intros [m]; simpl. - by rewrite Gfresh_fresh. + * by intros X Y; rewrite <-elem_of_equiv_L; intros ->. + * intros [[m Hm]]; unfold fresh; simpl. + by intros ?; apply (is_fresh (dom Pset m)), elem_of_dom_2 with (). Qed.