Theory XVcg
theory XVcg
imports Vcg
begin
text ‹We introduce a syntactic variant of the let-expression so that we can
safely unfold it during verification condition generation. With the new
theorem attribute ‹vcg_simp› we can declare equalities to be used
by the verification condition generator, while simplifying assertions.
›
syntax
"_Let'" :: "[letbinds, basicblock] => basicblock"
(‹(‹notation=‹mixfix LET expression››LET (_)/ IN (_))› 23)
syntax_consts
"_Let'" == Let'
translations
"_Let' (_binds b bs) e" == "_Let' b (_Let' bs e)"
"_Let' (_bind x a) e" == "CONST Let' a (%x. e)"
lemma Let'_unfold [vcg_simp]: "Let' x f = f x"
by (simp add: Let'_def Let_def)
lemma Let'_split_conv [vcg_simp]:
"(Let' x (λp. (case_prod (f p) (g p)))) =
(Let' x (λp. (f p) (fst (g p)) (snd (g p))))"
by (simp add: split_def)
end