From fafc06fee66e3d5d221803c8d6247081afe66f30 Mon Sep 17 00:00:00 2001 From: Dan Frumin <dfrumin@cs.ru.nl> Date: Thu, 20 Dec 2018 14:45:48 +0100 Subject: [PATCH] Lemmas about subst_map on closed expressions --- theories/heap_lang/metatheory.v | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/theories/heap_lang/metatheory.v b/theories/heap_lang/metatheory.v index a694f4b21..f5661364a 100644 --- a/theories/heap_lang/metatheory.v +++ b/theories/heap_lang/metatheory.v @@ -111,6 +111,9 @@ Definition binder_insert {A} (x : binder) (v : A) (vs : gmap string A) : gmap st Lemma binder_insert_fmap {A B : Type} (f : A → B) (x : A) b vs : f <$> binder_insert b x vs = binder_insert b (f x) (f <$> vs). Proof. destruct b; rewrite ?fmap_insert //. Qed. +Lemma lookup_binder_delete_None {A : Type} (vs : gmap string A) x y : + binder_delete x vs !! y = None ↔ x = BNamed y ∨ vs !! y = None. +Proof. destruct x; rewrite /= ?lookup_delete_None; naive_solver. Qed. Fixpoint subst_map (vs : gmap string val) (e : expr) : expr := match e with @@ -166,3 +169,20 @@ Lemma subst_map_binder_insert b v vs e : subst_map (binder_insert b v vs) e = subst' b v (subst_map (binder_delete b vs) e). Proof. destruct b; rewrite ?subst_map_insert //. Qed. + +(* subst_map on closed expressions *) +Lemma subst_map_is_closed X e vs : + is_closed_expr X e → + (∀ x, x ∈ X → vs !! x = None) → + subst_map vs e = e. +Proof. + revert X vs. assert (∀ x x1 x2 X (vs : gmap string val), + (∀ x, x ∈ X → vs !! x = None) → + x ∈ x2 :b: x1 :b: X → + binder_delete x1 (binder_delete x2 vs) !! x = None). + { intros x x1 x2 X vs ??. rewrite !lookup_binder_delete_None. set_solver. } + induction e=> X vs /= ? HX; repeat case_match; naive_solver eauto with f_equal. +Qed. + +Lemma subst_map_is_closed_nil e vs : is_closed_expr [] e → subst_map vs e = e. +Proof. intros. apply subst_map_is_closed with []; set_solver. Qed. -- GitLab