From c218e1ab35e6cbcd4d419c2fee2982ab9dff8f1d Mon Sep 17 00:00:00 2001 From: Robbert Krebbers <mail@robbertkrebbers.nl> Date: Thu, 17 Nov 2016 22:07:09 +0100 Subject: [PATCH] =?UTF-8?q?Add=20nclose=20N=20=E2=8A=86=20E=20=E2=86=92=20?= =?UTF-8?q?nclose=20(N=20.@=20x)=20=E2=8A=86=20E=20to=20ndisj=20hints.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base_logic/lib/namespaces.v | 52 +++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/base_logic/lib/namespaces.v b/base_logic/lib/namespaces.v index 06b91c92c..9bf4bd1c5 100644 --- a/base_logic/lib/namespaces.v +++ b/base_logic/lib/namespaces.v @@ -22,33 +22,38 @@ Definition nclose_eq : @nclose = @nclose_def := proj2_sig nclose_aux. Infix ".@" := ndot (at level 19, left associativity) : C_scope. Notation "(.@)" := ndot (only parsing) : C_scope. -Instance ndot_inj `{Countable A} : Inj2 (=) (=) (=) (@ndot A _ _). -Proof. intros N1 x1 N2 x2; rewrite !ndot_eq=> ?; by simplify_eq. Qed. -Lemma nclose_nroot : nclose nroot = ⊤. -Proof. rewrite nclose_eq. by apply (sig_eq_pi _). Qed. -Lemma encode_nclose N : encode N ∈ nclose N. -Proof. - rewrite nclose_eq. - by apply elem_coPset_suffixes; exists xH; rewrite (left_id_L _ _). -Qed. -Lemma nclose_subseteq `{Countable A} N x : nclose (N .@ x) ⊆ nclose N. -Proof. - intros p; rewrite nclose_eq /nclose !ndot_eq !elem_coPset_suffixes. - intros [q ->]. destruct (list_encode_suffix N (ndot_def N x)) as [q' ?]. - { by exists [encode x]. } - by exists (q ++ q')%positive; rewrite <-(assoc_L _); f_equal. -Qed. -Lemma ndot_nclose `{Countable A} N x : encode (N .@ x) ∈ nclose N. -Proof. apply nclose_subseteq with x, encode_nclose. Qed. -Lemma nclose_infinite N : ¬set_finite (nclose N). -Proof. rewrite nclose_eq. apply coPset_suffixes_infinite. Qed. - Instance ndisjoint : Disjoint namespace := λ N1 N2, nclose N1 ⊥ nclose N2. -Section ndisjoint. +Section namespace. Context `{Countable A}. Implicit Types x y : A. + Global Instance ndot_inj : Inj2 (=) (=) (=) (@ndot A _ _). + Proof. intros N1 x1 N2 x2; rewrite !ndot_eq=> ?; by simplify_eq. Qed. + + Lemma nclose_nroot : nclose nroot = ⊤. + Proof. rewrite nclose_eq. by apply (sig_eq_pi _). Qed. + Lemma encode_nclose N : encode N ∈ nclose N. + Proof. + rewrite nclose_eq. + by apply elem_coPset_suffixes; exists xH; rewrite (left_id_L _ _). + Qed. + + Lemma nclose_subseteq N x : nclose (N .@ x) ⊆ nclose N. + Proof. + intros p; rewrite nclose_eq /nclose !ndot_eq !elem_coPset_suffixes. + intros [q ->]. destruct (list_encode_suffix N (ndot_def N x)) as [q' ?]. + { by exists [encode x]. } + by exists (q ++ q')%positive; rewrite <-(assoc_L _); f_equal. + Qed. + Lemma nclose_subseteq' E N x : nclose N ⊆ E → nclose (N .@ x) ⊆ E. + Proof. intros. etrans; eauto using nclose_subseteq. Qed. + + Lemma ndot_nclose N x : encode (N .@ x) ∈ nclose N. + Proof. apply nclose_subseteq with x, encode_nclose. Qed. + Lemma nclose_infinite N : ¬set_finite (nclose N). + Proof. rewrite nclose_eq. apply coPset_suffixes_infinite. Qed. + Lemma ndot_ne_disjoint N x y : x ≠y → N .@ x ⊥ N .@ y. Proof. intros Hxy a. rewrite !nclose_eq !elem_coPset_suffixes !ndot_eq. @@ -65,7 +70,7 @@ Section ndisjoint. Lemma ndisj_subseteq_difference N E F : E ⊥ nclose N → E ⊆ F → E ⊆ F ∖ nclose N. Proof. set_solver. Qed. -End ndisjoint. +End namespace. (* The hope is that registering these will suffice to solve most goals of the form [N1 ⊥ N2] and those of the form [N1 ⊆ E ∖ N2 ∖ .. ∖ Nn]. *) @@ -73,5 +78,6 @@ Hint Resolve ndisj_subseteq_difference : ndisj. Hint Extern 0 (_ ⊥ _) => apply ndot_ne_disjoint; congruence : ndisj. Hint Resolve ndot_preserve_disjoint_l : ndisj. Hint Resolve ndot_preserve_disjoint_r : ndisj. +Hint Extern 1 (_ ⊆ _) => apply nclose_subseteq' : ndisj. Ltac solve_ndisj := solve [eauto with ndisj]. -- GitLab