Local Open Scope open_scope.

(* Specifications: *)
Lemma subst1_stack_add {B} (p : open B) (e : expr) (x : A) (v : val) (s : @stack A val) :
p[{e//x}] (stack_add x v s) = p[{e[{V_expr v//x}]//x}] s.
Lemma stack_add_var (x : A) (s : @stack A val) (v : val) : (stack_get x) (stack_add x v s) = v.
Lemma subst1_val (v : val) (e : open val) (x : A) :
(V_expr v)[{e//x}] = (V_expr v).
Lemma subst_identity {B} (x : A) (s : @stack A val) (p : open B) :
p[{(V_expr (s x))//x}] s = p s.
Lemma substl_trunc_notin x' xs es :
~ In x' xs ->
substl_trunc (combine xs es) x' = @empty_open _ val _.
Lemma subst1_trunc_singleton_stack {B} (p : open B) (s : @stack A val) x y :
p[{(stack_get y) //! x}] s = p (stack_add x (s y) (stack_empty A val)).