Commit 3c04addd authored by Robbert Krebbers's avatar Robbert Krebbers
Browse files

Improve iPvs to deal with mask changing viewshifts.

parent 2cec343c
...@@ -42,17 +42,20 @@ Global Instance fsa_split_fsa {A} (fsa : FSA Λ Σ A) E Φ : ...@@ -42,17 +42,20 @@ Global Instance fsa_split_fsa {A} (fsa : FSA Λ Σ A) E Φ :
FrameShiftAssertion fsaV fsa FSASplit (fsa E Φ) E fsa fsaV Φ. FrameShiftAssertion fsaV fsa FSASplit (fsa E Φ) E fsa fsaV Φ.
Proof. done. Qed. Proof. done. Qed.
Lemma tac_pvs_intro Δ E Q : Δ Q Δ |={E}=> Q. Lemma tac_pvs_intro Δ E1 E2 Q : E1 = E2 Δ Q Δ |={E1,E2}=> Q.
Proof. intros ->. apply pvs_intro. Qed. Proof. intros -> ->. apply pvs_intro. Qed.
Lemma tac_pvs_elim Δ Δ' E1 E2 E3 i p P' P Q : Lemma tac_pvs_elim Δ Δ' E1 E2 E3 i p P' E1' E2' P Q :
envs_lookup i Δ = Some (p, P') P' = (|={E1,E2}=> P)%I envs_lookup i Δ = Some (p, P') P' = (|={E1',E2'}=> P)%I
(E1' = E1 E2' = E2 E2 E1 E3
E2 = E2' E1 E1' E2' E1 E1' E1' E1 E2' E1' E3)
envs_replace i p false (Esnoc Enil i P) Δ = Some Δ' envs_replace i p false (Esnoc Enil i P) Δ = Some Δ'
E2 E1 E3
Δ' (|={E2,E3}=> Q) Δ |={E1,E3}=> Q. Δ' (|={E2,E3}=> Q) Δ |={E1,E3}=> Q.
Proof. Proof.
intros ? -> ?? HQ. rewrite envs_replace_sound //; simpl. intros ? -> HE ? HQ. rewrite envs_replace_sound //; simpl.
by rewrite always_if_elim right_id pvs_frame_r wand_elim_r HQ pvs_trans. rewrite always_if_elim right_id pvs_frame_r wand_elim_r HQ.
destruct HE as [(?&?&?)|(?&?&?&?)]; subst; first (by apply pvs_trans).
etrans; [eapply pvs_mask_frame'|apply pvs_trans]; auto; set_solver.
Qed. Qed.
Lemma tac_pvs_elim_fsa {A} (fsa : FSA Λ Σ A) fsaV Δ Δ' E i p P' P Q Φ : Lemma tac_pvs_elim_fsa {A} (fsa : FSA Λ Σ A) fsaV Δ Δ' E i p P' P Q Φ :
...@@ -97,17 +100,20 @@ Proof. ...@@ -97,17 +100,20 @@ Proof.
Qed. Qed.
End pvs. End pvs.
Tactic Notation "iPvsIntro" := apply tac_pvs_intro. Tactic Notation "iPvsIntro" := apply tac_pvs_intro; first try fast_done.
Tactic Notation "iPvsCore" constr(H) := Tactic Notation "iPvsCore" constr(H) :=
match goal with match goal with
| |- _ |={_,_}=> _ => | |- _ |={_,_}=> _ =>
eapply tac_pvs_elim with _ _ H _ _ _; eapply tac_pvs_elim with _ _ H _ _ _ _ _;
[env_cbv; reflexivity || fail "iPvs:" H "not found" [env_cbv; reflexivity || fail "iPvs:" H "not found"
|let P := match goal with |- ?P = _ => P end in |let P := match goal with |- ?P = _ => P end in
reflexivity || fail "iPvs:" H ":" P "not a pvs with the right mask" reflexivity || fail "iPvs:" H ":" P "not a pvs with the right mask"
|env_cbv; reflexivity |first
|try (rewrite (idemp_L ()); reflexivity)|] [left; split_and!;
[reflexivity|reflexivity|try (rewrite (idemp_L ()); reflexivity)]
|right; split; first reflexivity]
|env_cbv; reflexivity|]
| |- _ => | |- _ =>
eapply tac_pvs_elim_fsa with _ _ _ _ H _ _ _ _; eapply tac_pvs_elim_fsa with _ _ _ _ H _ _ _ _;
[env_cbv; reflexivity || fail "iPvs:" H "not found" [env_cbv; reflexivity || fail "iPvs:" H "not found"
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment