diff --git a/ectx_lang.v b/ectx_lang.v index 9a2c056820eebdb129f8a78134f0a66e7f5afc44..88778e90d04efa15564d11ce0918512861177bc6 100644 --- a/ectx_lang.v +++ b/ectx_lang.v @@ -177,7 +177,7 @@ Module ECTX_IRIS (RL : VIRA_T) (E : ECTX_LANG) (R: ECTX_RES RL E) (WP: WORLD_PRO Local Open Scope iris_scope. (** We can hae bind with evaluation contexts **) - Lemma fill_is_fill K: IsFill (E.fill K). + Lemma fill_is_ctx K: IsCtx (E.fill K). Proof. split; last split. - intros ? Hval. eapply E.fill_value. eassumption. @@ -196,13 +196,13 @@ Module ECTX_IRIS (RL : VIRA_T) (E : ECTX_LANG) (R: ECTX_RES RL E) (WP: WORLD_PRO Lemma wpBind φ K e safe m : wp safe m e (HTRules.plug_bind (E.fill K) safe m φ) ⊑ wp safe m (E.fill K e) φ. Proof. - apply wpBind. apply fill_is_fill. + apply wpBind. apply fill_is_ctx. Qed. Lemma htBind K P Q R e safe m : ht safe m P e Q ∧ all (plug_bind (E.fill K) safe m Q R) ⊑ ht safe m P (E.fill K e) R. Proof. - apply htBind. apply fill_is_fill. + apply htBind. apply fill_is_ctx. Qed. End ECTX_IRIS. diff --git a/iris_check.v b/iris_check.v index cf2a853c48c28671915e1bfa606b539601bc3319..c4abd386840086e67ef3b9ede1054064b88e6f1e 100644 --- a/iris_check.v +++ b/iris_check.v @@ -84,7 +84,7 @@ Module Import HTRules := IrisHTRules TrivialRA StupidLang Res World Core Plog. Module Import Meta := IrisMeta TrivialRA StupidLang Res World Core Plog HTRules. (* Make sure the precondition of Bind can actually be met. *) -Lemma id_is_fill: IsFill (fun e => e). +Lemma id_is_ctx: IsCtx (fun e => e). Proof. split; last split. - by firstorder. diff --git a/iris_derived_rules.v b/iris_derived_rules.v index 178fc6f32ee60402368c849373160195447a3e14..c21caf945bc8e26c4b05967b46e44fcc88d9d4a5 100644 --- a/iris_derived_rules.v +++ b/iris_derived_rules.v @@ -289,8 +289,8 @@ Module Type IRIS_DERIVED_RULES (RL : VIRA_T) (C : CORE_LANG) (R: IRIS_RES RL C) (** Quantification in the logic works over nonexpansive maps, so we need to show that plugging the value into the postcondition and context is nonexpansive. *) - Program Definition plug_bind (fill: expr -> expr) safe m Q Q' := - n[(fun v : value => ht safe m (Q v) (fill v) Q' )]. + Program Definition plug_bind (ctx: expr -> expr) safe m Q Q' := + n[(fun v : value => ht safe m (Q v) (ctx v) Q' )]. Next Obligation. intros v1 v2 EQv; unfold ht; eapply box_dist. eapply impl_dist. @@ -299,12 +299,12 @@ Module Type IRIS_DERIVED_RULES (RL : VIRA_T) (C : CORE_LANG) (R: IRIS_RES RL C) rewrite EQv; reflexivity. Qed. - Lemma htBind fill P Q R e safe m (HFill: IsFill fill) : - ht safe m P e Q ∧ all (plug_bind fill safe m Q R) ⊑ ht safe m P (fill e) R. + Lemma htBind ctx P Q R e safe m (HCtx: IsCtx ctx) : + ht safe m P e Q ∧ all (plug_bind ctx safe m Q R) ⊑ ht safe m P (ctx e) R. Proof. rewrite /plug_bind {1 2}/ht. etransitivity; last eapply htIntro. { erewrite box_conj. apply and_pord; first reflexivity. - erewrite (box_all (plug_bind fill safe m (pvs m m <M< Q) R)). apply all_pord=>v. simpl morph. + erewrite (box_all (plug_bind ctx safe m (pvs m m <M< Q) R)). apply all_pord=>v. simpl morph. rewrite /ht. apply box_intro, box_intro. apply and_impl. etransitivity; last eapply wpPreVS'. etransitivity; first by eapply pvsImpl. reflexivity. } etransitivity; last by eapply wpBind. diff --git a/iris_ht_rules.v b/iris_ht_rules.v index 8a0c0304947af6c1d7793194cc68b0e1b952fab0..dc83650160071e6b3630d050a3fdf2f27c3267b5 100644 --- a/iris_ht_rules.v +++ b/iris_ht_rules.v @@ -95,37 +95,37 @@ Module Type IRIS_HT_RULES (RL : VIRA_T) (C : CORE_LANG) (R: IRIS_RES RL C) (WP: (** Bind - in general **) Section Bind. - Definition IsFill (fill: expr -> expr): Prop := - (forall e, is_value (fill e) -> is_value e) /\ - (forall e1 σ1 e2 σ2 ef, prim_step (e1, σ1) (e2, σ2) ef -> prim_step (fill e1, σ1) (fill e2, σ2) ef) /\ - (forall e1 σ1 e2 σ2 ef, ~is_value e1 -> prim_step (fill e1, σ1) (e2, σ2) ef -> - exists e2', e2 = fill e2' /\ prim_step (e1, σ1) (e2', σ2) ef). - - Program Definition plug_bind (fill: expr -> expr) safe m φ := - n[(fun v : value => wp safe m (fill v) φ )]. + Definition IsCtx (ctx: expr -> expr): Prop := + (forall e, is_value (ctx e) -> is_value e) /\ + (forall e1 σ1 e2 σ2 ef, prim_step (e1, σ1) (e2, σ2) ef -> prim_step (ctx e1, σ1) (ctx e2, σ2) ef) /\ + (forall e1 σ1 e2 σ2 ef, ~is_value e1 -> prim_step (ctx e1, σ1) (e2, σ2) ef -> + exists e2', e2 = ctx e2' /\ prim_step (e1, σ1) (e2', σ2) ef). + + Program Definition plug_bind (ctx: expr -> expr) safe m φ := + n[(fun v : value => wp safe m (ctx v) φ )]. Next Obligation. intros v1 v2 EQv. destruct n as [|n]; first by apply: dist_bound. hnf in EQv. now rewrite EQv. Qed. - Lemma wpBind (fill: expr -> expr) φ e safe m (HFill: IsFill fill): - wp safe m e (plug_bind fill safe m φ) ⊑ wp safe m (fill e) φ. + Lemma wpBind ctx φ e safe m (HCtx: IsCtx ctx): + wp safe m e (plug_bind ctx safe m φ) ⊑ wp safe m (ctx e) φ. Proof. - intros w n He. destruct HFill as (HFval & HFstep & HFfstep). + intros w n He. destruct HCtx as (HCval & HCstep & HCfstep). revert e w He; induction n using wf_nat_ind; intros; rename H into IH. (* We need to actually decide whether e is a value, to establish safety in the case that it is not. *) destruct (is_value_dec e) as [HVal | HNVal]; [clear IH |]. - eapply (wpValue _ HVal) in He. exact:He. - rewrite ->unfold_wp in He; rewrite unfold_wp. split; intros. - { exfalso. apply HNVal, HFval, HV. } + { exfalso. apply HNVal, HCval, HV. } edestruct He as [_ He']; try eassumption; []; clear He. edestruct He' as [HS HSf]; try eassumption; []; clear He' HE HD. split; last first. { intros Heq. destruct (HSf Heq) as [?|[σ' [e' [ef Hstep]]]]; first contradiction. - right. do 3 eexists. eapply HFstep. eassumption. } - intros. edestruct (HFfstep e σ e' σ' ef) as (e'' & Heq' & Hstep'); first done; first done. + right. do 3 eexists. eapply HCstep. eassumption. } + intros. edestruct (HCfstep e σ e' σ' ef) as (e'' & Heq' & Hstep'); first done; first done. destruct (HS _ _ _ Hstep') as (wret & wfk & Hret & Hfk & HE). subst e'. exists wret wfk. split; last tauto. clear Hfk HE. eapply IH; assumption.