From c081e1b7819e6461ec22f4966d2ce68f716d055b Mon Sep 17 00:00:00 2001 From: Ralf Jung <jung@mpi-sws.org> Date: Thu, 20 Jun 2019 18:48:46 +0200 Subject: [PATCH] more generalization of lemmas and a few comments for [solve_ndisj] --- theories/namespaces.v | 19 ++++++++++++------- theories/sets.v | 8 ++++++-- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/theories/namespaces.v b/theories/namespaces.v index 2bc4ad07..06927213 100644 --- a/theories/namespaces.v +++ b/theories/namespaces.v @@ -66,9 +66,6 @@ Section namespace. Lemma ndot_preserve_disjoint_r N E x : E ## ↑N → E ## ↑N.@x. Proof. intros. by apply symmetry, ndot_preserve_disjoint_l. Qed. - - Lemma ndisj_difference_l E N1 N2 : ↑N2 ⊆ (↑N1 : coPset) → E ∖ ↑N1 ## ↑N2. - Proof. set_solver. Qed. End namespace. (* The hope is that registering these will suffice to solve most goals @@ -77,17 +74,25 @@ of the forms: - [↑N1 ⊆ E ∖ ↑N2 ∖ .. ∖ ↑Nn] - [E1 ∖ ↑N1 ⊆ E2 ∖ ↑N2 ∖ .. ∖ ↑Nn] *) Create HintDb ndisj. + (* Rules for goals of the form [_ ⊆ _] *) +(* If-and-only-if rules. Well, not quite, but for the fragment we are +considering they are. *) Hint Resolve (subseteq_difference_r (A:=positive) (C:=coPset)) : ndisj. -Hint Resolve nclose_subseteq' : ndisj. Hint Resolve (empty_subseteq (A:=positive) (C:=coPset)) : ndisj. Hint Resolve (union_least (A:=positive) (C:=coPset)) : ndisj. +(* Fallback, loses lots of information but lets other rules make progress. *) Hint Resolve (subseteq_difference_l (A:=positive) (C:=coPset)) | 100 : ndisj. +Hint Resolve nclose_subseteq' | 100 : ndisj. + (* Rules for goals of the form [_ ## _] *) +(* The base rule that we want to ultimately get down to. *) Hint Extern 0 (_ ## _) => apply ndot_ne_disjoint; congruence : ndisj. -Hint Resolve ndot_preserve_disjoint_l ndot_preserve_disjoint_r : ndisj. -Hint Resolve ndisj_difference_l : ndisj. -Hint Resolve (disjoint_difference_l (A:=positive) (C:=coPset)) | 100 : ndisj. +(* Fallback, loses lots of information but lets other rules make progress. +Tests show trying [disjoint_difference_l1] first gives better performance. *) +Hint Resolve (disjoint_difference_l1 (A:=positive) (C:=coPset)) | 50 : ndisj. +Hint Resolve (disjoint_difference_l2 (A:=positive) (C:=coPset)) | 100 : ndisj. +Hint Resolve ndot_preserve_disjoint_l ndot_preserve_disjoint_r | 100 : ndisj. Ltac solve_ndisj := repeat match goal with diff --git a/theories/sets.v b/theories/sets.v index fcd862b8..015b98d6 100644 --- a/theories/sets.v +++ b/theories/sets.v @@ -662,9 +662,13 @@ Section set. (** Disjointness *) Lemma disjoint_intersection X Y : X ## Y ↔ X ∩ Y ≡ ∅. Proof. set_solver. Qed. - Lemma disjoint_difference_l X Y1 Y2 : Y1 ## X → Y1 ∖ Y2 ## X. + Lemma disjoint_difference_l1 X1 X2 Y : Y ⊆ X2 → X1 ∖ X2 ## Y. Proof. set_solver. Qed. - Lemma disjoint_difference_r X Y1 Y2 : X ## Y1 → X ## Y1 ∖ Y2. + Lemma disjoint_difference_l2 X1 X2 Y : X1 ## Y → X1 ∖ X2 ## Y. + Proof. set_solver. Qed. + Lemma disjoint_difference_r1 X Y1 Y2 : X ⊆ Y2 → X ## Y1 ∖ Y2. + Proof. set_solver. Qed. + Lemma disjoint_difference_r2 X Y1 Y2 : X ## Y1 → X ## Y1 ∖ Y2. Proof. set_solver. Qed. Section leibniz. -- GitLab