diff --git a/theories/typing/contextual_refinement.v b/theories/typing/contextual_refinement.v index cd25e7cdabd01c8a6c36a19f41904dd2b995af9d..dc73e8fbc34bd46916257d135218f443b6c4c344 100644 --- a/theories/typing/contextual_refinement.v +++ b/theories/typing/contextual_refinement.v @@ -311,6 +311,82 @@ Definition ctx_refines_alt (Γ : stringmap type) rtc erased_step ([fill_ctx K e], σ₀) (of_val v1 :: thp, σâ‚) → ∃ thp' σâ‚' v2, rtc erased_step ([fill_ctx K e'], σ₀) (of_val v2 :: thp', σâ‚'). +(* Lemma erased_step_ectx (e e' : expr) tp' σ σ' K : *) +(* erased_step ([e], σ) (e' :: tp', σ') → *) +(* erased_step ([fill K e], σ) (fill K e' :: tp', σ'). *) +(* Proof. *) +(* intros [κ Hst]. inversion Hst; simplify_eq/=. *) +(* symmetry in H. apply app_singleton in H. *) +(* assert (t1 = [] ∧ e1 = e ∧ t2 = []) as (->&->&->). *) +(* { naive_solver. } *) +(* assert (e2 = e' ∧ tp' = efs) as [-> ->]. *) +(* { naive_solver. } *) +(* eapply fill_prim_step in H1. simpl in H1. *) +(* econstructor. eapply step_atomic with (t1 := []); eauto. *) +(* Qed. *) + +Lemma erased_step_ectx (e e' : expr) tp tp' σ σ' K : + erased_step (e :: tp, σ) (e' :: tp', σ') → + erased_step ((fill K e) :: tp, σ) (fill K e' :: tp', σ'). +Proof. + intros [κ Hst]. inversion Hst; simplify_eq/=. + destruct t1 as [|h1 t1]; simplify_eq/=. + { simplify_eq/=. + eapply fill_prim_step in H1. simpl in H1. + econstructor. eapply step_atomic with (t1 := []); eauto. } + econstructor. econstructor; eauto. + + rewrite app_comm_cons. reflexivity. + + rewrite app_comm_cons. reflexivity. +Qed. + + +Local Definition ffill (K : list ectx_item) : + (list expr * state) → (list expr * state) := + fun x => match x with + | (e :: tp, σ) => (fill K e :: tp, σ) + | ([], σ) => ([], σ) + end. + +Lemma erased_step_nonempty (tp : list expr) σ tp' σ' : + erased_step (tp, σ) (tp', σ') → tp' ≠[]. +Proof. + intros [? Hs]. + destruct Hs as [e1 σ1' e2 σ2' efs tp1 tp2 ?? Hstep]; simplify_eq/=. + intros [_ HH]%app_eq_nil. by inversion HH. +Qed. + +Lemma rtc_erased_step_nonempty (tp : list expr) σ tp' σ' : + rtc erased_step (tp, σ) (tp', σ') → tp ≠[] → tp' ≠[]. +Proof. + pose (P := λ (x y : list expr * state), x.1 ≠[] → y.1 ≠[]). + eapply (rtc_ind_r_weak P). + - intros [tp2 σ2]. unfold P. naive_solver. + - intros [tp1 σ1] [tp2 σ2] [tp3 σ3]. unfold P; simpl. + intros ? ?%erased_step_nonempty. naive_solver. +Qed. + +Lemma rtc_erased_step_ectx (e e' : expr) tp tp' σ σ' K : + rtc erased_step (e :: tp, σ) (e' :: tp', σ') → + rtc erased_step (fill K e :: tp, σ) (fill K e' :: tp', σ'). +Proof. + change (rtc erased_step (fill K e :: tp, σ) (fill K e' :: tp', σ')) + with (rtc erased_step (ffill K (e :: tp, σ)) (ffill K (e' :: tp', σ'))). + eapply (rtc_congruence (ffill K) erased_step). + clear e e' tp tp' σ σ'. + intros [tp σ] [tp' σ']. + destruct tp as [|e tp]. + - inversion 1. inversion H0. exfalso. + simplify_eq/=. by eapply app_cons_not_nil. + - intros Hstep1. + assert (tp' ≠[]). + { eapply (rtc_erased_step_nonempty (e::tp)). + econstructor; naive_solver. + naive_solver. } + destruct tp' as [|e' tp']; first naive_solver. + simpl. + by eapply erased_step_ectx. +Qed. + Lemma ctx_refines_impl_alt Γ e1 e2 Ï„ : (Γ ⊨ e1 ≤ctx≤ e2 : Ï„) → ctx_refines_alt Γ e1 e2 Ï„. @@ -328,7 +404,16 @@ Proof. + repeat econstructor; eauto. + repeat econstructor; eauto. + unfold C'. simpl. - admit. + trans (((of_val v1) ;; #true)%E :: thp, σ1); last first. + { econstructor. + - econstructor. + eapply (step_atomic) with (t1 := []); try reflexivity. + admit. + - admit. } + pose (K := [AppRCtx (λ: <>, #true)%E]). + change (fill_ctx C e1;; #true)%E with (fill K (fill_ctx C e1)). + change (v1;; #true)%E with (fill K (of_val v1)). + by eapply rtc_erased_step_ectx. Admitted. Definition ctx_equiv Γ e1 e2 Ï„ :=