diff --git a/barrier/barrier.v b/barrier/barrier.v index f960c0cd02070e195f6817a2d1f5e9158320c142..fd34e8f9b14bb3294637bad55eaa991bad59776a 100644 --- a/barrier/barrier.v +++ b/barrier/barrier.v @@ -237,15 +237,17 @@ Section proof. heapN ⊥ N → (recv l P ★ (P -★ Φ '())) ⊑ || wait (LocV l) {{ Φ }}. Proof. rename P into R. - intros Hdisj. rewrite /wait. rewrite [(_ ★ _)%I](pvs_intro ⊤). - apply löb_strong_sep. rewrite pvs_frame_r. apply wp_strip_pvs. + intros Hdisj. + (* TODO we probably want a tactic or lemma that does the next 2 lines for us. + It should be general enough to also cover FindPred_spec. Probably this + should be the default behavior of wp_rec - since this is what we need every time + we prove a recursive function correct. *) + rewrite /wait. rewrite [(_ ★ _)%I](pvs_intro ⊤). + apply löb_strong_sep. rewrite pvs_frame_r. apply wp_strip_pvs. wp_rec. rewrite {1}/recv /barrier_ctx. rewrite !sep_exist_r. apply exist_elim=>γ. rewrite !sep_exist_r. apply exist_elim=>P. rewrite !sep_exist_r. apply exist_elim=>Q. rewrite !sep_exist_r. - apply exist_elim=>i. wp_rec. - (* TODO use automatic binding *) - rewrite -(wp_bindi (IfCtx _ _)) /=. - rewrite -(wp_bindi (BinOpLCtx _ _)) /=. + apply exist_elim=>i. wp_focus (! _)%L. (* I think some evars here are better than repeating *everything* *) eapply (sts_fsaS _ (wp_fsa _)) with (N0:=N) (γ0:=γ); simpl; eauto with I ndisj. diff --git a/heap_lang/lifting.v b/heap_lang/lifting.v index b653903fe957a8e65880fdf993ccdd14e771751e..5359b62ba1a0990e528c9c4e7e4a4836710291ae 100644 --- a/heap_lang/lifting.v +++ b/heap_lang/lifting.v @@ -19,11 +19,6 @@ Lemma wp_bind {E e} K Φ : || e @ E {{ λ v, || fill K (of_val v) @ E {{ Φ }}}} ⊑ || fill K e @ E {{ Φ }}. Proof. apply weakestpre.wp_bind. Qed. -Lemma wp_bindi {E e} Ki Φ : - || e @ E {{ λ v, || fill_item Ki (of_val v) @ E {{ Φ }}}} - ⊑ || fill_item Ki e @ E {{ Φ }}. -Proof. apply weakestpre.wp_bind. Qed. - (** Base axioms for core primitives of the language: Stateful reductions. *) Lemma wp_alloc_pst E σ e v Φ : to_val e = Some v →