diff --git a/prelude/co_pset.v b/prelude/co_pset.v index b0c656325dc507a212841dbcbc55b82052206c33..cfa255b5398b980453caca1b4297bfc0abad1e84 100644 --- a/prelude/co_pset.v +++ b/prelude/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