text‹
The list of ‹ann_triple› is useful if the code calls the same function multiple times
and require different annotations for the function body each time. › type_synonym ('s,'p,'f) proc_assns = "'p → (('s, 'p, 'f) ann) list option"
abbreviation (input) pres:: "('s, 'p, 'f) ann_triple → ('s, 'p, 'f) ann"
where "pres a ≡ fst a"
abbreviation (input) postcond :: "('s, 'p, 'f) ann_triple → 's assn"
where "postcond a ≡ fst (snd a)"
abbreviation (input) abrcond :: "('s, 'p, 'f) ann_triple → 's assn"
where "abrcond a ≡ snd (snd a)"
funpre :: "('s, 'p, 'f) ann → 's assn" where "pre (AnnExpr r) = r"
| "pre (AnnRec r e) = r"
| "pre (AnnWhile r i e) = r"
| "pre (AnnComp e1 e2) = pre e1"
| "pre (AnnBin r e1 e2) = r"
| "pre (AnnPar as) = ∩ (pre ` set (map pres (as)))"
| "pre (AnnCall r n) = r"
fun pre_par :: "('s, 'p, 'f) ann → bool" where "pre_par (AnnComp e1 e2) = pre_par e1"
| "pre_par (AnnPar as) = True"
| "pre_par _ = False"
fun pre_set :: "('s, 'p, 'f) ann → ('s assn) set" where "pre_set (AnnExpr r) = {r}"
| "pre_set (AnnRec r e) = {r}"
| "pre_set (AnnWhile r i e) = {r}"
| "pre_set (AnnComp e1 e2) = pre_set e1"
| "pre_set (AnnBin r e1 e2) = {r}"
| "pre_set (AnnPar as) = ∪ (pre_set ` set (map pres (as)))" (*| "pre_set (AnnPar e\<^sub>1 e\<^sub>2) = pre_set (pres e\<^sub>1) \<union> pre_set (pres e\<^sub>2)" *)
| "pre_set (AnnCall r n) = {r}"
lemma fst_BNFs[simp]: "a ∈ Basic_BNFs.fsts (a,b)" using fsts.introsby auto
lemma"¬pre_par c ==> pre c ∈ pre_set c" by (induct c; simp)
lemma pre_set: "pre c = ∩ (pre_set c)" by (induct c; fastforce)
lemma pre_imp_pre_set: "s ∈ pre c ==> a ∈ pre_set c ==> s ∈ a" by (simp add: pre_set)
abbreviation precond :: "('s, 'p, 'f) ann_triple → 's assn"
where "precond a ≡ pre (fst a)"
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.