diff --git a/theories/base_logic/lib/auth.v b/theories/base_logic/lib/auth.v index d5638eeb0de494a271d9d4766bced126e40f33fe..d1288be4d77286c70653f6e4861427ede64b8c4a 100644 --- a/theories/base_logic/lib/auth.v +++ b/theories/base_logic/lib/auth.v @@ -75,8 +75,8 @@ Section auth. Global Instance from_sep_auth_own γ a b1 b2 : FromOp a b1 b2 → - FromSep (auth_own γ a) (auth_own γ b1) (auth_own γ b2) | 90. - Proof. rewrite /FromOp /FromSep=> <-. by rewrite auth_own_op. Qed. + FromAnd false (auth_own γ a) (auth_own γ b1) (auth_own γ b2) | 90. + Proof. rewrite /FromOp /FromAnd=> <-. by rewrite auth_own_op. Qed. Global Instance into_and_auth_own p γ a b1 b2 : IntoOp a b1 b2 → IntoAnd p (auth_own γ a) (auth_own γ b1) (auth_own γ b2) | 90. diff --git a/theories/base_logic/lib/fancy_updates.v b/theories/base_logic/lib/fancy_updates.v index eaf2651c703b565bb60b96a518760e1e10011b5a..f1413c7907be4f07f3448fc07ba1a939d780db5a 100644 --- a/theories/base_logic/lib/fancy_updates.v +++ b/theories/base_logic/lib/fancy_updates.v @@ -160,9 +160,9 @@ Section proofmode_classes. rewrite /WandWeaken' /WandWeaken=>->. apply wand_intro_l. by rewrite fupd_wand_r. Qed. - Global Instance from_sep_fupd E P Q1 Q2 : - FromSep P Q1 Q2 → FromSep (|={E}=> P) (|={E}=> Q1) (|={E}=> Q2). - Proof. rewrite /FromSep=><-. apply fupd_sep. Qed. + Global Instance from_and_fupd E P Q1 Q2 : + FromAnd false P Q1 Q2 → FromAnd false (|={E}=> P) (|={E}=> Q1) (|={E}=> Q2). + Proof. rewrite /FromAnd=><-. apply fupd_sep. Qed. Global Instance or_split_fupd E1 E2 P Q1 Q2 : FromOr P Q1 Q2 → FromOr (|={E1,E2}=> P) (|={E1,E2}=> Q1) (|={E1,E2}=> Q2). diff --git a/theories/base_logic/lib/fractional.v b/theories/base_logic/lib/fractional.v index fb9a6b0338cc2dd18dfb502744a600643f4af44c..bbc74de35a7f02cd26f6f3ff22b56584ae25a65a 100644 --- a/theories/base_logic/lib/fractional.v +++ b/theories/base_logic/lib/fractional.v @@ -120,23 +120,23 @@ Section fractional. Qed. (** Proof mode instances *) - Global Instance from_sep_fractional_fwd P P1 P2 Φ q1 q2 : + Global Instance from_and_fractional_fwd P P1 P2 Φ q1 q2 : AsFractional P Φ (q1 + q2) → AsFractional P1 Φ q1 → AsFractional P2 Φ q2 → - FromSep P P1 P2. - Proof. by rewrite /FromSep=>-[-> ->] [-> _] [-> _]. Qed. + FromAnd false P P1 P2. + Proof. by rewrite /FromAnd=>-[-> ->] [-> _] [-> _]. Qed. Global Instance from_sep_fractional_bwd P P1 P2 Φ q1 q2 : AsFractional P1 Φ q1 → AsFractional P2 Φ q2 → AsFractional P Φ (q1 + q2) → - FromSep P P1 P2 | 10. - Proof. by rewrite /FromSep=>-[-> _] [-> <-] [-> _]. Qed. + FromAnd false P P1 P2 | 10. + Proof. by rewrite /FromAnd=>-[-> _] [-> <-] [-> _]. Qed. - Global Instance from_sep_fractional_half_fwd P Q Φ q : + Global Instance from_and_fractional_half_fwd P Q Φ q : AsFractional P Φ q → AsFractional Q Φ (q/2) → - FromSep P Q Q | 10. - Proof. by rewrite /FromSep -{1}(Qp_div_2 q)=>-[-> ->] [-> _]. Qed. - Global Instance from_sep_fractional_half_bwd P Q Φ q : + FromAnd false P Q Q | 10. + Proof. by rewrite /FromAnd -{1}(Qp_div_2 q)=>-[-> ->] [-> _]. Qed. + Global Instance from_and_fractional_half_bwd P Q Φ q : AsFractional P Φ (q/2) → AsFractional Q Φ q → - FromSep Q P P. - Proof. rewrite /FromSep=>-[-> <-] [-> _]. by rewrite Qp_div_2. Qed. + FromAnd false Q P P. + Proof. rewrite /FromAnd=>-[-> <-] [-> _]. by rewrite Qp_div_2. Qed. Global Instance into_and_fractional b P P1 P2 Φ q1 q2 : AsFractional P Φ (q1 + q2) → AsFractional P1 Φ q1 → AsFractional P2 Φ q2 → @@ -163,10 +163,12 @@ Section fractional. Inductive FrameFractionalHyps (p : bool) (R : uPred M) (Φ : Qp → uPred M) (RES : uPred M) : Qp → Qp → Prop := | frame_fractional_hyps_l Q q q' r: - Frame p R (Φ q) Q → MakeSep Q (Φ q') RES → + Frame p R (Φ q) Q → + MakeSep Q (Φ q') RES → FrameFractionalHyps p R Φ RES r (q + q') | frame_fractional_hyps_r Q q q' r: - Frame p R (Φ q') Q → MakeSep Q (Φ q) RES → + Frame p R (Φ q') Q → + MakeSep Q (Φ q) RES → FrameFractionalHyps p R Φ RES r (q + q') | frame_fractional_hyps_half q : AsFractional RES Φ (q/2) → @@ -174,6 +176,7 @@ Section fractional. Existing Class FrameFractionalHyps. Global Existing Instances frame_fractional_hyps_l frame_fractional_hyps_r frame_fractional_hyps_half. + Global Instance frame_fractional p R r Φ P q RES: AsFractional R Φ r → AsFractional P Φ q → FrameFractionalHyps p R Φ RES r q → diff --git a/theories/base_logic/lib/own.v b/theories/base_logic/lib/own.v index 24c20fae6444db93559828ad2ba7b0d5f997d6ce..34fa9638302cdcf80441ec3202e5e3de435b215c 100644 --- a/theories/base_logic/lib/own.v +++ b/theories/base_logic/lib/own.v @@ -186,7 +186,7 @@ Section proofmode_classes. Global Instance into_and_own p γ a b1 b2 : IntoOp a b1 b2 → IntoAnd p (own γ a) (own γ b1) (own γ b2). Proof. intros. apply mk_into_and_sep. by rewrite (into_op a) own_op. Qed. - Global Instance from_sep_own γ a b1 b2 : - FromOp a b1 b2 → FromSep (own γ a) (own γ b1) (own γ b2). - Proof. intros. by rewrite /FromSep -own_op from_op. Qed. + Global Instance from_and_own γ a b1 b2 : + FromOp a b1 b2 → FromAnd false (own γ a) (own γ b1) (own γ b2). + Proof. intros. by rewrite /FromAnd -own_op from_op. Qed. End proofmode_classes. diff --git a/theories/proofmode/class_instances.v b/theories/proofmode/class_instances.v index 467aa43870329dfb95e801ea7e1ebd5d3dccfd46..5b182dd709647ef366db679bb620ee19d1f0e627 100644 --- a/theories/proofmode/class_instances.v +++ b/theories/proofmode/class_instances.v @@ -300,56 +300,49 @@ Proof. Qed. (* FromAnd *) -Global Instance from_and_and P1 P2 : FromAnd (P1 ∧ P2) P1 P2. +Global Instance from_and_and p P1 P2 : FromAnd p (P1 ∧ P2) P1 P2 | 100. +Proof. by apply mk_from_and_and. Qed. + +Global Instance from_and_sep P1 P2 : FromAnd false (P1 ∗ P2) P1 P2 | 100. Proof. done. Qed. Global Instance from_and_sep_persistent_l P1 P2 : - PersistentP P1 → FromAnd (P1 ∗ P2) P1 P2 | 9. + PersistentP P1 → FromAnd true (P1 ∗ P2) P1 P2 | 9. Proof. intros. by rewrite /FromAnd always_and_sep_l. Qed. Global Instance from_and_sep_persistent_r P1 P2 : - PersistentP P2 → FromAnd (P1 ∗ P2) P1 P2 | 10. + PersistentP P2 → FromAnd true (P1 ∗ P2) P1 P2 | 10. Proof. intros. by rewrite /FromAnd always_and_sep_r. Qed. -Global Instance from_and_pure φ ψ : @FromAnd M ⌜φ ∧ ψ⌠⌜φ⌠⌜ψâŒ. -Proof. by rewrite /FromAnd pure_and. Qed. -Global Instance from_and_always P Q1 Q2 : - FromAnd P Q1 Q2 → FromAnd (â–¡ P) (â–¡ Q1) (â–¡ Q2). -Proof. rewrite /FromAnd=> <-. by rewrite always_and. Qed. -Global Instance from_and_later P Q1 Q2 : - FromAnd P Q1 Q2 → FromAnd (â–· P) (â–· Q1) (â–· Q2). -Proof. rewrite /FromAnd=> <-. by rewrite later_and. Qed. -Global Instance from_and_laterN n P Q1 Q2 : - FromAnd P Q1 Q2 → FromAnd (â–·^n P) (â–·^n Q1) (â–·^n Q2). -Proof. rewrite /FromAnd=> <-. by rewrite laterN_and. Qed. - -(* FromSep *) -Global Instance from_sep_sep P1 P2 : FromSep (P1 ∗ P2) P1 P2 | 100. -Proof. done. Qed. + +Global Instance from_and_pure p φ ψ : @FromAnd M p ⌜φ ∧ ψ⌠⌜φ⌠⌜ψâŒ. +Proof. apply mk_from_and_and. by rewrite pure_and. Qed. +Global Instance from_and_always p P Q1 Q2 : + FromAnd false P Q1 Q2 → FromAnd p (â–¡ P) (â–¡ Q1) (â–¡ Q2). +Proof. + intros. apply mk_from_and_and. + by rewrite always_and_sep_l' -always_sep -(from_and _ P). +Qed. +Global Instance from_and_later p P Q1 Q2 : + FromAnd p P Q1 Q2 → FromAnd p (â–· P) (â–· Q1) (â–· Q2). +Proof. rewrite /FromAnd=> <-. destruct p; by rewrite ?later_and ?later_sep. Qed. +Global Instance from_and_laterN p n P Q1 Q2 : + FromAnd p P Q1 Q2 → FromAnd p (â–·^n P) (â–·^n Q1) (â–·^n Q2). +Proof. rewrite /FromAnd=> <-. destruct p; by rewrite ?laterN_and ?laterN_sep. Qed. + Global Instance from_sep_ownM (a b1 b2 : M) : FromOp a b1 b2 → - FromSep (uPred_ownM a) (uPred_ownM b1) (uPred_ownM b2). -Proof. intros. by rewrite /FromSep -ownM_op from_op. Qed. - -Global Instance from_sep_pure φ ψ : @FromSep M ⌜φ ∧ ψ⌠⌜φ⌠⌜ψâŒ. -Proof. by rewrite /FromSep pure_and sep_and. Qed. -Global Instance from_sep_always P Q1 Q2 : - FromSep P Q1 Q2 → FromSep (â–¡ P) (â–¡ Q1) (â–¡ Q2). -Proof. rewrite /FromSep=> <-. by rewrite always_sep. Qed. -Global Instance from_sep_later P Q1 Q2 : - FromSep P Q1 Q2 → FromSep (â–· P) (â–· Q1) (â–· Q2). -Proof. rewrite /FromSep=> <-. by rewrite later_sep. Qed. -Global Instance from_sep_laterN n P Q1 Q2 : - FromSep P Q1 Q2 → FromSep (â–·^n P) (â–·^n Q1) (â–·^n Q2). -Proof. rewrite /FromSep=> <-. by rewrite laterN_sep. Qed. + FromAnd false (uPred_ownM a) (uPred_ownM b1) (uPred_ownM b2). +Proof. intros. by rewrite /FromAnd -ownM_op from_op. Qed. + Global Instance from_sep_bupd P Q1 Q2 : - FromSep P Q1 Q2 → FromSep (|==> P) (|==> Q1) (|==> Q2). -Proof. rewrite /FromSep=><-. apply bupd_sep. Qed. - -Global Instance from_sep_big_sepL_cons {A} (Φ : nat → A → uPred M) x l : - FromSep ([∗ list] k ↦ y ∈ x :: l, Φ k y) (Φ 0 x) ([∗ list] k ↦ y ∈ l, Φ (S k) y). -Proof. by rewrite /FromSep big_sepL_cons. Qed. -Global Instance from_sep_big_sepL_app {A} (Φ : nat → A → uPred M) l1 l2 : - FromSep ([∗ list] k ↦ y ∈ l1 ++ l2, Φ k y) + FromAnd false P Q1 Q2 → FromAnd false (|==> P) (|==> Q1) (|==> Q2). +Proof. rewrite /FromAnd=><-. apply bupd_sep. Qed. + +Global Instance from_and_big_sepL_cons {A} (Φ : nat → A → uPred M) x l : + FromAnd false ([∗ list] k ↦ y ∈ x :: l, Φ k y) (Φ 0 x) ([∗ list] k ↦ y ∈ l, Φ (S k) y). +Proof. by rewrite /FromAnd big_sepL_cons. Qed. +Global Instance from_and_big_sepL_app {A} (Φ : nat → A → uPred M) l1 l2 : + FromAnd false ([∗ list] k ↦ y ∈ l1 ++ l2, Φ k y) ([∗ list] k ↦ y ∈ l1, Φ k y) ([∗ list] k ↦ y ∈ l2, Φ (length l1 + k) y). -Proof. by rewrite /FromSep big_sepL_app. Qed. +Proof. by rewrite /FromAnd big_sepL_app. Qed. (* FromOp *) Global Instance from_op_op {A : cmraT} (a b : A) : FromOp (a â‹… b) a b. diff --git a/theories/proofmode/classes.v b/theories/proofmode/classes.v index c61a243aa86893233761a7d77a7d2a752355c04e..133e6d105a43bf271b850326fb2fc927bd37ce83 100644 --- a/theories/proofmode/classes.v +++ b/theories/proofmode/classes.v @@ -75,14 +75,14 @@ Class IntoWand {M} (R P Q : uPred M) := into_wand : R ⊢ P -∗ Q. Arguments into_wand {_} _ _ _ {_}. Hint Mode IntoWand + ! - - : typeclass_instances. -Class FromAnd {M} (P Q1 Q2 : uPred M) := from_and : Q1 ∧ Q2 ⊢ P. -Arguments from_and {_} _ _ _ {_}. -Hint Mode FromAnd + ! - - : typeclass_instances. - -Class FromSep {M} (P Q1 Q2 : uPred M) := from_sep : Q1 ∗ Q2 ⊢ P. -Arguments from_sep {_} _ _ _ {_}. -Hint Mode FromSep + ! - - : typeclass_instances. -Hint Mode FromSep + - ! ! : typeclass_instances. (* For iCombine *) +Class FromAnd {M} (p : bool) (P Q1 Q2 : uPred M) := + from_and : (if p then Q1 ∧ Q2 else Q1 ∗ Q2) ⊢ P. +Arguments from_and {_} _ _ _ _ {_}. +Hint Mode FromAnd + + ! - - : typeclass_instances. +Hint Mode FromAnd + + - ! ! : typeclass_instances. (* For iCombine *) +Lemma mk_from_and_and {M} p (P Q1 Q2 : uPred M) : + (Q1 ∧ Q2 ⊢ P) → FromAnd p P Q1 Q2. +Proof. rewrite /FromAnd=><-. destruct p; auto using sep_and. Qed. Class IntoAnd {M} (p : bool) (P Q1 Q2 : uPred M) := into_and : P ⊢ if p then Q1 ∧ Q2 else Q1 ∗ Q2. diff --git a/theories/proofmode/coq_tactics.v b/theories/proofmode/coq_tactics.v index 66591afe5e4d0edb7506dbadcab4c9e40a9e444f..29272ebc49ced480907431fe2e918b16ca289f68 100644 --- a/theories/proofmode/coq_tactics.v +++ b/theories/proofmode/coq_tactics.v @@ -748,16 +748,17 @@ Proof. Qed. (** * Conjunction splitting *) -Lemma tac_and_split Δ P Q1 Q2 : FromAnd P Q1 Q2 → (Δ ⊢ Q1) → (Δ ⊢ Q2) → Δ ⊢ P. -Proof. intros. rewrite -(from_and P). by apply and_intro. Qed. +Lemma tac_and_split Δ P Q1 Q2 : + FromAnd true P Q1 Q2 → (Δ ⊢ Q1) → (Δ ⊢ Q2) → Δ ⊢ P. +Proof. intros. rewrite -(from_and true P). by apply and_intro. Qed. (** * Separating conjunction splitting *) Lemma tac_sep_split Δ Δ1 Δ2 lr js P Q1 Q2 : - FromSep P Q1 Q2 → + FromAnd false P Q1 Q2 → envs_split lr js Δ = Some (Δ1,Δ2) → (Δ1 ⊢ Q1) → (Δ2 ⊢ Q2) → Δ ⊢ P. Proof. - intros. rewrite envs_split_sound // -(from_sep P). by apply sep_mono. + intros. rewrite envs_split_sound // -(from_and false P). by apply sep_mono. Qed. (** * Combining *) @@ -770,8 +771,8 @@ Proof. done. Qed. Global Instance from_seps_singleton P : FromSeps P [P] | 1. Proof. by rewrite /FromSeps /= right_id. Qed. Global Instance from_seps_cons P P' Q Qs : - FromSeps P' Qs → FromSep P Q P' → FromSeps P (Q :: Qs) | 2. -Proof. by rewrite /FromSeps /FromSep /= => ->. Qed. + FromSeps P' Qs → FromAnd false P Q P' → FromSeps P (Q :: Qs) | 2. +Proof. by rewrite /FromSeps /FromAnd /= => ->. Qed. Lemma tac_combine Δ1 Δ2 Δ3 js p Ps j P Q : envs_lookup_delete_list js false Δ1 = Some (p, Ps, Δ2) → diff --git a/theories/proofmode/tactics.v b/theories/proofmode/tactics.v index d12e7d4d9b98dd963faac79303e91b8ab48e0727..049649aa67f5b46d1bc528e39f23ae83c16181b6 100644 --- a/theories/proofmode/tactics.v +++ b/theories/proofmode/tactics.v @@ -674,7 +674,7 @@ Tactic Notation "iSplit" := | |- _ ⊢ _ => eapply tac_and_split; [apply _ || - let P := match goal with |- FromAnd ?P _ _ => P end in + let P := match goal with |- FromAnd _ ?P _ _ => P end in fail "iSplit:" P "not a conjunction"| |] end. @@ -683,7 +683,7 @@ Tactic Notation "iSplitL" constr(Hs) := let Hs := words Hs in eapply tac_sep_split with _ _ false Hs _ _; (* (js:=Hs) *) [apply _ || - let P := match goal with |- FromSep ?P _ _ => P end in + let P := match goal with |- FromAnd _ ?P _ _ => P end in fail "iSplitL:" P "not a separating conjunction" |env_reflexivity || let Hs := iMissingHyps Hs in @@ -695,7 +695,7 @@ Tactic Notation "iSplitR" constr(Hs) := let Hs := words Hs in eapply tac_sep_split with _ _ true Hs _ _; (* (js:=Hs) *) [apply _ || - let P := match goal with |- FromSep ?P _ _ => P end in + let P := match goal with |- FromAnd _ ?P _ _ => P end in fail "iSplitR:" P "not a separating conjunction" |env_reflexivity || let Hs := iMissingHyps Hs in diff --git a/theories/tests/proofmode.v b/theories/tests/proofmode.v index f8781a441c6049d70faa613645f2721442487f53..d7d35bdb05ece8a31f047ed7d0e6c77705611b48 100644 --- a/theories/tests/proofmode.v +++ b/theories/tests/proofmode.v @@ -169,3 +169,7 @@ Qed. Lemma test_frame_persistent (M : ucmraT) (P Q : uPred M) : â–¡ P -∗ Q -∗ â–¡ (P ∗ P) ∗ (P ∧ Q ∨ Q). Proof. iIntros "#HP". iFrame "HP". iIntros "$". Qed. + +Lemma test_split_box (M : ucmraT) (P Q : uPred M) : + â–¡ P -∗ â–¡ (P ∗ P). +Proof. iIntros "#?". by iSplit. Qed.