diff --git a/prelude/finite.v b/prelude/finite.v index 02a0f84a54bd84ead3dcb304dc529c7f12501b6d..7eb33e676b915f144e94e77147791796550d07cd 100644 --- a/prelude/finite.v +++ b/prelude/finite.v @@ -1,6 +1,6 @@ (* Copyright (c) 2012-2015, Robbert Krebbers. *) (* This file is distributed under the terms of the BSD license. *) -From iris.prelude Require Export countable list. +From iris.prelude Require Export countable vector. Class Finite A `{∀ x y : A, Decision (x = y)} := { enum : list A; @@ -61,6 +61,39 @@ Proof. exists y. by rewrite !Nat2Pos.id by done. Qed. +Definition encode_fin `{Finite A} (x : A) : fin (card A) := + Fin.of_nat_lt (encode_lt_card x). +Program Definition decode_fin `{Finite A} (i : fin (card A)) : A := + match Some_dec (decode_nat i) return _ with + | inleft (exist x _) => x | inright _ => _ + end. +Next Obligation. + intros A ?? i ?; exfalso. + destruct (encode_decode A i); naive_solver auto using fin_to_nat_lt. +Qed. +Lemma decode_encode_fin `{Finite A} (x : A) : decode_fin (encode_fin x) = x. +Proof. + unfold decode_fin, encode_fin. destruct (Some_dec _) as [[x' Hx]|Hx]. + { by rewrite fin_to_of_nat, decode_encode_nat in Hx; simplify_eq. } + exfalso; by rewrite ->fin_to_of_nat, decode_encode_nat in Hx. +Qed. + +Lemma fin_choice {n} {B : fin n → Type} (P : ∀ i, B i → Prop) : + (∀ i, ∃ y, P i y) → ∃ f, ∀ i, P i (f i). +Proof. + induction n as [|n IH]; intros Hex. + { exists (fin_0_inv _); intros i; inv_fin i. } + destruct (IH _ _ (λ i, Hex (FS i))) as [f Hf], (Hex 0%fin) as [y Hy]. + exists (fin_S_inv _ y f); intros i; by inv_fin i. +Qed. +Lemma finite_choice `{Finite A} {B : A → Type} (P : ∀ x, B x → Prop) : + (∀ x, ∃ y, P x y) → ∃ f, ∀ x, P x (f x). +Proof. + intros Hex. destruct (fin_choice _ (λ i, Hex (decode_fin i))) as [f ?]. + exists (λ x, eq_rect _ _ (f(encode_fin x)) _ (decode_encode_fin x)); intros x. + destruct (decode_encode_fin x); simpl; auto. +Qed. + Lemma card_0_inv P `{finA: Finite A} : card A = 0 → A → P. Proof. intros ? x. destruct finA as [[|??] ??]; simplify_eq. @@ -297,3 +330,18 @@ Proof. induction (enum A) as [|x xs IH]; intros l; simpl; auto. by rewrite app_length, fmap_length, IH. Qed. + +Fixpoint fin_enum (n : nat) : list (fin n) := + match n with 0 => [] | S n => 0%fin :: FS <$> fin_enum n end. +Program Instance fin_finite n : Finite (fin n) := {| enum := fin_enum n |}. +Next Obligation. + intros n. induction n; simpl; constructor. + - rewrite elem_of_list_fmap. by intros (?&?&?). + - by apply (NoDup_fmap _). +Qed. +Next Obligation. + intros n i. induction i as [|n i IH]; simpl; + rewrite elem_of_cons, ?elem_of_list_fmap; eauto. +Qed. +Lemma fin_card n : card (fin n) = n. +Proof. unfold card; simpl. induction n; simpl; rewrite ?fmap_length; auto. Qed. diff --git a/prelude/vector.v b/prelude/vector.v index ee6e9b1fd6a1e50f8514416c42563a2fe799b47f..26f78e9451e419fb4f04d05a9365e2f3addbbe12 100644 --- a/prelude/vector.v +++ b/prelude/vector.v @@ -5,7 +5,7 @@ definitions from the standard library, but renames or changes their notations, so that it becomes more consistent with the naming conventions in this development. *) -From iris.prelude Require Import list finite. +From iris.prelude Require Export list. Open Scope vector_scope. (** * The fin type *) @@ -82,21 +82,6 @@ Proof. revert m H. induction n; intros [|?]; simpl; auto; intros; exfalso; lia. Qed. -Fixpoint fin_enum (n : nat) : list (fin n) := - match n with 0 => [] | S n => 0%fin :: FS <$> fin_enum n end. -Program Instance fin_finite n : Finite (fin n) := {| enum := fin_enum n |}. -Next Obligation. - intros n. induction n; simpl; constructor. - - rewrite elem_of_list_fmap. by intros (?&?&?). - - by apply (NoDup_fmap _). -Qed. -Next Obligation. - intros n i. induction i as [|n i IH]; simpl; - rewrite elem_of_cons, ?elem_of_list_fmap; eauto. -Qed. -Lemma fin_card n : card (fin n) = n. -Proof. unfold card; simpl. induction n; simpl; rewrite ?fmap_length; auto. Qed. - (** * Vectors *) (** The type [vec n] represents lists of consisting of exactly [n] elements. Whereas the standard library declares exactly the same notations for vectors as