From 461bd9f02e39bd1d8a2ef31a08bf610da88fbc06 Mon Sep 17 00:00:00 2001 From: Ralf Jung <jung@mpi-sws.org> Date: Fri, 12 Feb 2016 18:19:32 +0100 Subject: [PATCH] heap_lang: rename lifting lemmas so that the final forms do not have a prime --- heap_lang/derived.v | 10 +++++----- heap_lang/lifting.v | 8 +++++--- heap_lang/substitution.v | 20 ++++++++++---------- heap_lang/tests.v | 6 +++--- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/heap_lang/derived.v b/heap_lang/derived.v index a8fd8ea2e..6ce1fad8e 100644 --- a/heap_lang/derived.v +++ b/heap_lang/derived.v @@ -15,18 +15,18 @@ Implicit Types P : iProp heap_lang Σ. Implicit Types Q : val → iProp heap_lang Σ. (** Proof rules for the sugar *) -Lemma wp_lam E x ef e v Q : +Lemma wp_lam' E x ef e v Q : to_val e = Some v → ▷ wp E (subst ef x v) Q ⊑ wp E (App (Lam x ef) e) Q. -Proof. intros. by rewrite -wp_rec ?subst_empty. Qed. +Proof. intros. by rewrite -wp_rec' ?subst_empty. Qed. -Lemma wp_let E x e1 e2 v Q : +Lemma wp_let' E x e1 e2 v Q : to_val e1 = Some v → ▷ wp E (subst e2 x v) Q ⊑ wp E (Let x e1 e2) Q. -Proof. apply wp_lam. Qed. +Proof. apply wp_lam'. Qed. Lemma wp_seq E e1 e2 Q : wp E e1 (λ _, ▷ wp E e2 Q) ⊑ wp E (Seq e1 e2) Q. Proof. rewrite -(wp_bind [LetCtx "" e2]). apply wp_mono=>v. - by rewrite -wp_let //= ?to_of_val ?subst_empty. + by rewrite -wp_let' //= ?to_of_val ?subst_empty. Qed. Lemma wp_le E (n1 n2 : Z) P Q : diff --git a/heap_lang/lifting.v b/heap_lang/lifting.v index 2904ef540..bcea9d2e9 100644 --- a/heap_lang/lifting.v +++ b/heap_lang/lifting.v @@ -84,7 +84,9 @@ Proof. by rewrite -(wp_value' _ _ (Lit _)) //; apply const_intro. Qed. -Lemma wp_rec E f x e1 e2 v Q : +(* For the lemmas involving substitution, we only derive a preliminary version. + The final version is defined in substitution.v. *) +Lemma wp_rec' E f x e1 e2 v Q : to_val e2 = Some v → ▷ wp E (subst (subst e1 f (RecV f x e1)) x v) Q ⊑ wp E (App (Rec f x e1) e2) Q. Proof. @@ -137,7 +139,7 @@ Proof. ?right_id -?wp_value' //; intros; inv_step; eauto. Qed. -Lemma wp_case_inl E e0 v0 x1 e1 x2 e2 Q : +Lemma wp_case_inl' E e0 v0 x1 e1 x2 e2 Q : to_val e0 = Some v0 → ▷ wp E (subst e1 x1 v0) Q ⊑ wp E (Case (InjL e0) x1 e1 x2 e2) Q. Proof. @@ -145,7 +147,7 @@ Proof. (subst e1 x1 v0) None) ?right_id //; intros; inv_step; eauto. Qed. -Lemma wp_case_inr E e0 v0 x1 e1 x2 e2 Q : +Lemma wp_case_inr' E e0 v0 x1 e1 x2 e2 Q : to_val e0 = Some v0 → ▷ wp E (subst e2 x2 v0) Q ⊑ wp E (Case (InjR e0) x1 e1 x2 e2) Q. Proof. diff --git a/heap_lang/substitution.v b/heap_lang/substitution.v index 27d57f967..74176c30b 100644 --- a/heap_lang/substitution.v +++ b/heap_lang/substitution.v @@ -120,32 +120,32 @@ Implicit Types P : iProp heap_lang Σ. Implicit Types Q : val → iProp heap_lang Σ. Hint Resolve to_of_val. -Lemma wp_rec' E e1 f x erec e2 v Q : +Lemma wp_rec E e1 f x erec e2 v Q : e1 = Rec f x erec → to_val e2 = Some v → ▷ wp E (gsubst (gsubst erec f e1) x e2) Q ⊑ wp E (App e1 e2) Q. Proof. intros -> <-%of_to_val. rewrite (gsubst_correct _ _ (RecV _ _ _)) gsubst_correct. - by apply wp_rec. + by apply wp_rec'. Qed. -Lemma wp_lam' E x ef e v Q : +Lemma wp_lam E x ef e v Q : to_val e = Some v → ▷ wp E (gsubst ef x e) Q ⊑ wp E (App (Lam x ef) e) Q. -Proof. intros <-%of_to_val; rewrite gsubst_correct. by apply wp_lam. Qed. +Proof. intros <-%of_to_val; rewrite gsubst_correct. by apply wp_lam'. Qed. -Lemma wp_let' E x e1 e2 v Q : +Lemma wp_let E x e1 e2 v Q : to_val e1 = Some v → ▷ wp E (gsubst e2 x e1) Q ⊑ wp E (Let x e1 e2) Q. -Proof. apply wp_lam'. Qed. +Proof. apply wp_lam. Qed. -Lemma wp_case_inl' E e0 v0 x1 e1 x2 e2 Q : +Lemma wp_case_inl E e0 v0 x1 e1 x2 e2 Q : to_val e0 = Some v0 → ▷ wp E (gsubst e1 x1 e0) Q ⊑ wp E (Case (InjL e0) x1 e1 x2 e2) Q. -Proof. intros <-%of_to_val; rewrite gsubst_correct. by apply wp_case_inl. Qed. +Proof. intros <-%of_to_val; rewrite gsubst_correct. by apply wp_case_inl'. Qed. -Lemma wp_case_inr' E e0 v0 x1 e1 x2 e2 Q : +Lemma wp_case_inr E e0 v0 x1 e1 x2 e2 Q : to_val e0 = Some v0 → ▷ wp E (gsubst e2 x2 e0) Q ⊑ wp E (Case (InjR e0) x1 e1 x2 e2) Q. -Proof. intros <-%of_to_val; rewrite gsubst_correct. by apply wp_case_inr. Qed. +Proof. intros <-%of_to_val; rewrite gsubst_correct. by apply wp_case_inr'. Qed. End wp. diff --git a/heap_lang/tests.v b/heap_lang/tests.v index 76bc32a4d..a459db55c 100644 --- a/heap_lang/tests.v +++ b/heap_lang/tests.v @@ -69,12 +69,12 @@ Module LiftingTests. rewrite (comm uPred_and (■_)%I) assoc; apply const_elim_r=>?. (* first need to do the rec to get a later *) rewrite -(wp_bindi (AppLCtx _)) /=. - rewrite -wp_rec' // =>-/=; rewrite -wp_value' //=. + rewrite -wp_rec // =>-/=; rewrite -wp_value' //=. (* FIXME: ssr rewrite fails with "Error: _pattern_value_ is used in conclusion." *) rewrite ->(later_intro (Q _)). rewrite -!later_and; apply later_mono. (* Go on *) - rewrite -wp_let' //= -later_intro. + rewrite -wp_let //= -later_intro. rewrite -(wp_bindi (LetCtx _ _)) -wp_bin_op //= -wp_let' //= -!later_intro. rewrite -(wp_bindi (IfCtx _ _)) /=. apply wp_lt=> ?. @@ -88,7 +88,7 @@ Module LiftingTests. Lemma Pred_spec n E Q : ▷ Q (LitV (n - 1)) ⊑ wp E (Pred 'n)%L Q. Proof. - rewrite -wp_lam' //=. + rewrite -wp_lam //=. rewrite -(wp_bindi (IfCtx _ _)) /=. apply later_mono, wp_le=> Hn. - rewrite -wp_if_true. -- GitLab