diff --git a/theories/namespaces.v b/theories/namespaces.v index 2bc4ad0705f6d7b7a534efcc3f581fd75f624083..06927213beccfd10ba7dbd3514a32214bc30127a 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 fcd862b89f30c5db188ad7497a2ada07125ae52e..015b98d6843358dcdcfeedd90145161a93d1c9da 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.