Theory Values
theory Values imports Language Map begin
consts
Val :: i
ValEnv :: i
Val_ValEnv :: i
codatatype
"Val" = v_const ("c ∈ Const")
| v_clos ("x ∈ ExVar","e ∈ Exp","ve ∈ ValEnv")
and
"ValEnv" = ve_mk ("m ∈ PMap(ExVar,Val)")
monos PMap_mono
type_intros A_into_univ mapQU
consts
ve_owr :: "[i,i,i] ⇒ i"
ve_dom :: "i⇒i"
ve_app :: "[i,i] ⇒ i"
primrec "ve_owr(ve_mk(m), x, v) = ve_mk(map_owr(m,x,v))"
primrec "ve_dom(ve_mk(m)) = domain(m)"
primrec "ve_app(ve_mk(m), a) = map_app(m,a)"
definition
ve_emp :: i where
"ve_emp ≡ ve_mk(map_emp)"
lemma ValEnvE:
"⟦ve ∈ ValEnv; ⋀m.⟦ve=ve_mk(m); m ∈ PMap(ExVar,Val)⟧ ⟹ Q⟧ ⟹ Q"
apply (unfold Part_def Val_def ValEnv_def, clarify)
apply (erule Val_ValEnv.cases)
apply (auto simp add: Val_def Part_def Val_ValEnv.con_defs)
done
lemma ValE:
"⟦v ∈ Val;
⋀c. ⟦v = v_const(c); c ∈ Const⟧ ⟹ Q;
⋀e ve x.
⟦v = v_clos(x,e,ve); x ∈ ExVar; e ∈ Exp; ve ∈ ValEnv⟧ ⟹ Q
⟧ ⟹
Q"
apply (unfold Part_def Val_def ValEnv_def, clarify)
apply (erule Val_ValEnv.cases)
apply (auto simp add: ValEnv_def Part_def Val_ValEnv.con_defs)
done
lemma v_closNE [simp]: "v_clos(x,e,ve) ≠ 0"
by (unfold QPair_def QInl_def QInr_def Val_ValEnv.con_defs, blast)
declare v_closNE [THEN notE, elim!]
lemma v_constNE [simp]: "c ∈ Const ⟹ v_const(c) ≠ 0"
unfolding QPair_def QInl_def QInr_def Val_ValEnv.con_defs
apply (drule constNEE, auto)
done
lemma ValNEE: "v ∈ Val ⟹ v ≠ 0"
by (erule ValE, auto)
lemma ve_dom_owr [simp]:
"⟦ve ∈ ValEnv; v ≠0⟧ ⟹ ve_dom(ve_owr(ve,x,v)) = ve_dom(ve) ∪ {x}"
apply (erule ValEnvE)
apply (auto simp add: map_domain_owr)
done
lemma ve_app_owr [simp]:
"ve ∈ ValEnv
⟹ ve_app(ve_owr(ve,y,v),x) = (if x=y then v else ve_app(ve,x))"
by (erule ValEnvE, simp add: map_app_owr)
lemma ve_appI: "⟦ve ∈ ValEnv; x ∈ ve_dom(ve)⟧ ⟹ ve_app(ve,x):Val"
by (erule ValEnvE, simp add: pmap_appI)
lemma ve_domI: "⟦ve ∈ ValEnv; x ∈ ve_dom(ve)⟧ ⟹ x ∈ ExVar"
apply (erule ValEnvE, simp)
apply (blast dest: pmap_domainD)
done
lemma ve_empI: "ve_emp ∈ ValEnv"
unfolding ve_emp_def
apply (rule Val_ValEnv.intros)
apply (rule pmap_empI)
done
lemma ve_owrI:
"⟦ve ∈ ValEnv; x ∈ ExVar; v ∈ Val⟧ ⟹ ve_owr(ve,x,v):ValEnv"
apply (erule ValEnvE, simp)
apply (blast intro: pmap_owrI Val_ValEnv.intros)
done
end