From a6f3114220485b59e4aaaec4cf15454ea3b11862 Mon Sep 17 00:00:00 2001 From: Ralf Jung <post@ralfj.de> Date: Mon, 25 Jan 2016 22:30:55 +0100 Subject: [PATCH] strengthen adequacy: allow ownership of an arbitrary valid ghost in the beginning --- iris/adequacy.v | 48 ++++++++++++++++++++++++++++++------------------ iris/wsat.v | 7 ++++--- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/iris/adequacy.v b/iris/adequacy.v index 5d89cf931..fed684c55 100644 --- a/iris/adequacy.v +++ b/iris/adequacy.v @@ -63,46 +63,58 @@ Proof. apply Hht with r1 (k + n); eauto using @ra_included_unit. by destruct (k + n). Qed. -Theorem ht_adequacy_result E φ e v t2 σ1 σ2 : - {{ ownP σ1 }} e @ E {{ λ v', ■φ v' }} → +Lemma ht_adequacy_own Q e1 t2 σ1 m σ2 : + ✓m → + {{ ownP σ1 ★ ownG m }} e1 @ coPset_all {{ Q }} → + rtc step ([e1],σ1) (t2,σ2) → + ∃ rs2 Qs', wptp 3 t2 ((λ v, pvs coPset_all coPset_all (Q v)) :: Qs') rs2 ∧ + wsat 3 coPset_all σ2 (big_op rs2). +Proof. + intros Hv ? [k ?]%rtc_nsteps. eapply ht_adequacy_steps with (r1 := (Res ∅ (Excl σ1) m)); eauto; [|]. + - by rewrite Nat.add_comm; apply wsat_init, cmra_valid_validN. + - exists (Res ∅ (Excl σ1) ∅), (Res ∅ ∅ m). split_ands. + + by rewrite /op /cmra_op /= /res_op /= !ra_empty_l ra_empty_r. + + by rewrite /uPred_holds /=. + + by apply ownG_spec. +Qed. +Theorem ht_adequacy_result E φ e v t2 σ1 m σ2 : + ✓m → + {{ ownP σ1 ★ ownG m }} e @ E {{ λ v', ■φ v' }} → rtc step ([e], σ1) (of_val v :: t2, σ2) → φ v. Proof. - intros ? [k ?]%rtc_nsteps. - destruct (ht_adequacy_steps (ownP σ1) (λ v', ■φ v')%I k 2 e - (of_val v :: t2) σ1 σ2 (Res ∅ (Excl σ1) ∅)) as (rs2&Qs&Hwptp&?); auto. + intros Hv ? Hs. + destruct (ht_adequacy_own (λ v', ■φ v')%I e (of_val v :: t2) σ1 m σ2) + as (rs2&Qs&Hwptp&?); auto. { by rewrite -(ht_mask_weaken E coPset_all). } - { rewrite Nat.add_comm; apply wsat_init. } - { by rewrite /uPred_holds /=. } inversion Hwptp as [|?? r ?? rs Hwp _]; clear Hwptp; subst. - apply wp_value_inv in Hwp; destruct (Hwp (big_op rs) 2 ∅ σ2) as [r' []]; auto. + apply wp_value_inv in Hwp; destruct (Hwp (big_op rs) 3 ∅ σ2) as [r' []]; auto. by rewrite right_id_L. Qed. -Lemma ht_adequacy_reducible E Q e1 e2 t2 σ1 σ2 : - {{ ownP σ1 }} e1 @ E {{ Q }} → +Lemma ht_adequacy_reducible E Q e1 e2 t2 σ1 m σ2 : + ✓m → + {{ ownP σ1 ★ ownG m }} e1 @ E {{ Q }} → rtc step ([e1], σ1) (t2, σ2) → e2 ∈ t2 → to_val e2 = None → reducible e2 σ2. Proof. - intros ? [k ?]%rtc_nsteps [i ?]%elem_of_list_lookup He. - destruct (ht_adequacy_steps (ownP σ1) Q k 3 e1 - t2 σ1 σ2 (Res ∅ (Excl σ1) ∅)) as (rs2&Qs&?&?); auto. + intros Hv ? Hs [i ?]%elem_of_list_lookup He. + destruct (ht_adequacy_own Q e1 t2 σ1 m σ2) as (rs2&Qs&?&?); auto. { by rewrite -(ht_mask_weaken E coPset_all). } - { rewrite Nat.add_comm; apply wsat_init. } - { by rewrite /uPred_holds /=. } destruct (Forall3_lookup_l (λ e Q r, wp coPset_all e Q 3 r) t2 (pvs coPset_all coPset_all ∘ Q :: Qs) rs2 i e2) as (Q'&r2&?&?&Hwp); auto. destruct (wp_step_inv coPset_all ∅ Q' e2 2 3 σ2 r2 (big_op (delete i rs2))); rewrite ?right_id_L ?big_op_delete; auto. Qed. -Theorem ht_adequacy_safe E Q e1 t2 σ1 σ2 : - {{ ownP σ1 }} e1 @ E {{ Q }} → +Theorem ht_adequacy_safe E Q e1 t2 σ1 m σ2 : + ✓m → + {{ ownP σ1 ★ ownG m }} e1 @ E {{ Q }} → rtc step ([e1], σ1) (t2, σ2) → Forall (λ e, is_Some (to_val e)) t2 ∨ ∃ t3 σ3, step (t2, σ2) (t3, σ3). Proof. intros. destruct (decide (Forall (λ e, is_Some (to_val e)) t2)) as [|Ht2]; [by left|]. apply (not_Forall_Exists _), Exists_exists in Ht2; destruct Ht2 as (e2&?&He2). - destruct (ht_adequacy_reducible E Q e1 e2 t2 σ1 σ2) as (e3&σ3&ef&?); + destruct (ht_adequacy_reducible E Q e1 e2 t2 σ1 m σ2) as (e3&σ3&ef&?); rewrite ?eq_None_not_Some; auto. destruct (elem_of_list_split t2 e2) as (t2'&t2''&->); auto. right; exists (t2' ++ e3 :: t2'' ++ option_list ef), σ3; econstructor; eauto. diff --git a/iris/wsat.v b/iris/wsat.v index a9afb6fac..7a8a38e51 100644 --- a/iris/wsat.v +++ b/iris/wsat.v @@ -63,11 +63,12 @@ Proof. destruct n; [intros; apply cmra_valid_0|intros [rs ?]]. eapply cmra_valid_op_l, wsat_pre_valid; eauto. Qed. -Lemma wsat_init k E σ : wsat (S k) E σ (Res ∅ (Excl σ) ∅). +Lemma wsat_init k E σ m : ✓{S k} m → wsat (S k) E σ (Res ∅ (Excl σ) m). Proof. - exists ∅; constructor; auto. + intros Hv. exists ∅; constructor; auto. * rewrite big_opM_empty right_id. - split_ands'; try (apply cmra_valid_validN, ra_empty_valid); constructor. + split_ands'; try (apply cmra_valid_validN, ra_empty_valid); + constructor || apply Hv. * by intros i; rewrite lookup_empty=>-[??]. * intros i P ?; rewrite /= (left_id _ _) lookup_empty; inversion_clear 1. Qed. -- GitLab