From 3d516a4f932539e875b637fa3be902a9fc2e36bb Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Sat, 16 Jan 2016 04:30:02 +0100
Subject: [PATCH] Conversion gset positive -> coPset.

---
 prelude/co_pset.v | 47 ++++++++++++++++++++++++++++++++---------------
 1 file changed, 32 insertions(+), 15 deletions(-)

diff --git a/prelude/co_pset.v b/prelude/co_pset.v
index cfa255b53..55efb4f78 100644
--- a/prelude/co_pset.v
+++ b/prelude/co_pset.v
@@ -3,7 +3,7 @@
 (** This files implements an efficient implementation of finite/cofinite sets
 of positive binary naturals [positive]. *)
 Require Export prelude.collections.
-Require Import prelude.pmap prelude.mapset.
+Require Import prelude.pmap prelude.gmap prelude.mapset.
 Local Open Scope positive_scope.
 
 (** * The tree data structure *)
@@ -274,18 +274,43 @@ Proof.
   * destruct l as [|[]], r as [|[]]; simpl in *; rewrite ?andb_true_r;
       rewrite ?andb_True; rewrite ?andb_True in IHl, IHr; intuition.
 Qed.
+Lemma elem_of_of_Pset_raw i t : e_of i (of_Pset_raw t) ↔ t !! i = Some ().
+Proof. by revert i; induction t as [|[[]|]]; intros []; simpl; auto; split. Qed.
+Lemma of_Pset_raw_finite t : coPset_finite (of_Pset_raw t).
+Proof. induction t as [|[[]|]]; simpl; rewrite ?andb_True; auto. Qed.
+
 Definition of_Pset (X : Pset) : coPset :=
   let 'Mapset (PMap t Ht) := X in of_Pset_raw t ↾ of_Pset_wf _ Ht.
 Lemma elem_of_of_Pset X i : i ∈ of_Pset X ↔ i ∈ X.
+Proof. destruct X as [[t ?]]; apply elem_of_of_Pset_raw. Qed.
+Lemma of_Pset_finite X : set_finite (of_Pset X).
 Proof.
-  destruct X as [[t Ht]]; change (e_of i (of_Pset_raw t) ↔ t !! i = Some ()).
-  clear Ht; revert i.
-  induction t as [|[[]|] l IHl r IHr]; intros [i|i|]; simpl; auto; by split.
+  apply coPset_finite_spec; destruct X as [[t ?]]; apply of_Pset_raw_finite.
 Qed.
-Lemma of_Pset_finite X : set_finite (of_Pset X).
+
+(** * Conversion from gsets of positives *)
+Definition of_gset (X : gset positive) : coPset :=
+  let 'Mapset (GMap (PMap t Ht) _) := X in of_Pset_raw t ↾ of_Pset_wf _ Ht.
+Lemma elem_of_of_gset X i : i ∈ of_gset X ↔ i ∈ X.
+Proof. destruct X as [[[t ?]]]; apply elem_of_of_Pset_raw. Qed.
+Lemma of_gset_finite X : set_finite (of_gset X).
+Proof.
+  apply coPset_finite_spec; destruct X as [[[t ?]]]; apply of_Pset_raw_finite.
+Qed.
+
+(** * Domain of finite maps *)
+Instance Pmap_dom_coPset {A} : Dom (Pmap A) coPset := λ m, of_Pset (dom _ m).
+Instance Pmap_dom_coPset_spec: FinMapDom positive Pmap coPset.
 Proof.
-  rewrite coPset_finite_spec; destruct X as [[t Ht]]; simpl; clear Ht.
-  induction t as [|[[]|] l IHl r IHr]; simpl; rewrite ?andb_True; auto.
+  split; try apply _; intros A m i; unfold dom, Pmap_dom_coPset.
+  by rewrite elem_of_of_Pset, elem_of_dom.
+Qed.
+Instance gmap_dom_coPset {A} : Dom (gmap positive A) coPset := λ m,
+  of_gset (dom _ m).
+Instance gmap_dom_coPset_spec: FinMapDom positive (gmap positive) coPset.
+Proof.
+  split; try apply _; intros A m i; unfold dom, gmap_dom_coPset.
+  by rewrite elem_of_of_gset, elem_of_dom.
 Qed.
 
 (** * Suffix sets *)
@@ -307,14 +332,6 @@ Proof.
   * by intros [q' ->]; induction q; simpl; rewrite ?coPset_elem_of_node.
 Qed.
 
-(** * Domain of finite maps *)
-Instance Pmap_dom_Pset {A} : Dom (Pmap A) coPset := λ m, of_Pset (dom _ m).
-Instance Pmap_dom_coPset: FinMapDom positive Pmap coPset.
-Proof.
-  split; try apply _; intros A m i; unfold dom, Pmap_dom_Pset.
-  by rewrite elem_of_of_Pset, elem_of_dom.
-Qed.
-
 (** * Splitting of infinite sets *)
 Fixpoint coPset_l_raw (t : coPset_raw) : coPset_raw :=
   match t with
-- 
GitLab