Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/Isabelle/Archive-of-Formal-Proofs/thys/Complx/   (Sammlung formaler Beweise Version 2026-5©)  Datei vom 29.4.2026 mit Größe 7 kB image not shown  

Quelle  OG_Annotations.thy

  Sprache: Isabelle
 

(*
 * Copyright 2016, Data61, CSIRO
 *
 * This software may be distributed and modified according to the terms of
 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
 * See "LICENSE_BSD2.txt" for details.
 *
 * @TAG(DATA61_BSD)
 *)

section Annotations, assertions and associated operations

theory OG_Annotations
imports SmallStep
begin

type_synonym 's assn = "'s set"

datatype ('s, dead 'p, dead 'f) ann =
    AnnExpr "'s assn" 
  | AnnRec "'s assn" "('s, 'p, 'f) ann"
  | AnnWhile "'s assn" "'s assn" "('s, 'p, 'f) ann"
  | AnnComp "('s, 'p, 'f) ann" "('s, 'p, 'f) ann"
  | AnnBin "'s assn" "('s, 'p, 'f) ann" "('s, 'p, 'f) ann"
  | AnnPar "(('s, 'p, 'f) ann × 's assn × 's assn) list"
  | AnnCall "'s assn" nat

type_synonym ('s, 'p, 'f) ann_triple = "('s, 'p, 'f) ann × 's assn × 's assn"

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)"

fun pre :: "('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.intros by 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)"

fun strengthen_pre :: "('s, 'p, 'f) ann ==> 's assn ==> ('s, 'p, 'f) ann" where
  "strengthen_pre (AnnExpr r) r' = AnnExpr (r r')"                                                                                               
"strengthen_pre (AnnRec r e) r' = AnnRec (r r') e"
"strengthen_pre (AnnWhile r i e) r' = AnnWhile (r r') i e"
"strengthen_pre (AnnComp e1 e2) r' = AnnComp (strengthen_pre e1 r') e2"
"strengthen_pre (AnnBin r e1 e2) r' = AnnBin (r r') e1 e2"
"strengthen_pre (AnnPar as) r' = (AnnPar as)"
"strengthen_pre (AnnCall r n) r' = AnnCall (r r') n"

fun weaken_pre :: "('s, 'p, 'f) ann ==> 's assn ==> ('s, 'p, 'f) ann" where
  "weaken_pre (AnnExpr r) r' = AnnExpr (r r')"                                                                                               
"weaken_pre (AnnRec r e) r' = AnnRec (r r') e"
"weaken_pre (AnnWhile r i e) r' = AnnWhile (r r') i e"
"weaken_pre (AnnComp e1 e2) r' = AnnComp (weaken_pre e1 r') e2"
"weaken_pre (AnnBin r e1 e2) r' = AnnBin (r r') e1 e2"
"weaken_pre (AnnPar as) r' = AnnPar as"
"weaken_pre (AnnCall r n) r' = AnnCall (r r') n"

lemma weaken_pre_empty[simp]:
  "weaken_pre r {} = r"
  by (induct r) auto

text Annotations for call definition (see Language.thy)
definition
 ann_call :: "'s assn ==> 's assn ==> nat ==> 's assn ==>'s assn ==> 's assn ==> 's assn ==> ('s,'p,'f) ann"
where
 "ann_call init r n restoreq return restorea A
  AnnRec init (AnnComp (AnnComp (AnnComp (AnnExpr init) (AnnCall r n)) (AnnComp (AnnExpr restorea) (AnnExpr A)))
          (AnnRec restoreq (AnnComp (AnnExpr restoreq) (AnnExpr return))))"


inductive ann_matches :: "('s,'p,'f) body ==> ('s,'p,'f) proc_assns ==> ('s, 'p, 'f) ann ==> ('s, 'p, 'f) com ==> bool" where
  ann_skip: "ann_matches Γ Θ (AnnExpr a) Skip"
| ann_basic: "ann_matches Γ Θ (AnnExpr a) (Basic f)"
| ann_spec: "ann_matches Γ Θ (AnnExpr a) (Spec r)"
| ann_throw: "ann_matches Γ Θ (AnnExpr a) (Throw)"
| ann_await: "ann_matches Γ Θ a e ==>
               ann_matches Γ Θ (AnnRec r a) (Await b e)"
| ann_seq: "[ ann_matches Γ Θ a1 p1; ann_matches Γ Θ a2 p2 ] ==>
               ann_matches Γ Θ (AnnComp a1 a2) (Seq p1 p2)"
| ann_cond: "[ ann_matches Γ Θ a1 c1; ann_matches Γ Θ a2 c2 ] ==>
               ann_matches Γ Θ (AnnBin a a1 a2) (Cond b c1 c2)"
| ann_catch: "[ ann_matches Γ Θ a1 c1; ann_matches Γ Θ a2 c2 ] ==>
                ann_matches Γ Θ (AnnComp a1 a2) (Catch c1 c2)"
| ann_while: "ann_matches Γ Θ a' e ==>
                ann_matches Γ Θ (AnnWhile a i a') (While b e)"
| ann_guard: "[ ann_matches Γ Θ a' e ] ==>
                ann_matches Γ Θ (AnnRec a a') (Guard f b e)"
| ann_call: "[ Θ f = Some as; Γ f = Some b; n < length as;
               ann_matches Γ Θ (as!n) b] ==>
   ann_matches Γ Θ (AnnCall a n) (Call f)"
| ann_dyncom: "sr. ann_matches Γ Θ a (c s) ==>
               ann_matches Γ Θ (AnnRec r a) (DynCom c)"
| ann_parallel: "[ length as = length cs;
                   i<length cs. ann_matches Γ Θ (pres (as!i)) (cs!i) ] ==>
   ann_matches Γ Θ (AnnPar as) (Parallel cs)"

primrec ann_guards:: "'s assn ==> ('f × 's bexp ) list ==>
                  ('s,'p,'f) ann ==> ('s,'p,'f) ann"
where
  "ann_guards _ [] c = c" |
  "ann_guards r (g#gs) c = AnnRec r (ann_guards (r snd g) gs c)"

end

Messung V0.5 in Prozent
C=94 H=100 G=96

¤ Dauer der Verarbeitung: 0.23 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

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.