From 32b2e751f4fbbdc69b085e8e16ebe5674c23fb86 Mon Sep 17 00:00:00 2001 From: Robbert Krebbers <mail@robbertkrebbers.nl> Date: Sat, 16 Jan 2016 04:29:30 +0100 Subject: [PATCH] Pick element from infinite coPset. --- theories/co_pset.v | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/theories/co_pset.v b/theories/co_pset.v index b0c65632..cfa255b5 100644 --- a/theories/co_pset.v +++ b/theories/co_pset.v @@ -210,6 +210,37 @@ Proof. refine (cast_if (decide (coPset_finite (`X)))); by rewrite coPset_finite_spec. Defined. +(** * Pick element from infitinite sets *) +(* just depth-first search: using this to pick elements results in very +unbalanced trees. *) +Fixpoint coPpick_raw (t : coPset_raw) : option positive := + match t with + | coPLeaf true | coPNode true _ _ => Some 1 + | coPLeaf false => None + | coPNode false l r => + match coPpick_raw l with + | Some i => Some (i~0) | None => (~1) <$> coPpick_raw r + end + end. +Definition coPpick (X : coPset) : positive := from_option 1 (coPpick_raw (`X)). + +Lemma coPpick_raw_elem_of t i : coPpick_raw t = Some i → e_of i t. +Proof. + revert i; induction t as [[]|[] l ? r]; intros i ?; simplify_equality'; auto. + destruct (coPpick_raw l); simplify_option_equality; auto. +Qed. +Lemma coPpick_raw_None t : coPpick_raw t = None → coPset_finite t. +Proof. + induction t as [[]|[] l ? r]; intros i; simplify_equality'; auto. + destruct (coPpick_raw l); simplify_option_equality; auto. +Qed. +Lemma coPpick_elem_of X : ¬set_finite X → coPpick X ∈ X. +Proof. + destruct X as [t ?]; unfold coPpick; destruct (coPpick_raw _) as [j|] eqn:?. + * by intros; apply coPpick_raw_elem_of. + * by intros []; apply coPset_finite_spec, coPpick_raw_None. +Qed. + (** * Conversion to psets *) Fixpoint to_Pset_raw (t : coPset_raw) : Pmap_raw () := match t with -- GitLab