(* Time-stamp: The Grail Hume Processor, formalised as Isabelle theory file. This version is used in D17 as program logic Variant: - quantifying over function names, not arbitrary expressions, in CallVar - collecting pre-conds for CallVar in preUnderApp and preExactApp - using an undefined tickExp function (see ResAlg), param over syntax and ResConst Major change: . redefined PConInd and CostrInd, so that aux lemmas env_env_notin and ConstrInd_h_same can be proven (see VdmDerived.thy) *) header {* GRUMPY *} (*<*) theory GRUMPY = Basics + Grail + ResAlg: (*>*) text {* GRUMPY is a VM at a higher level than HAM, more akin to the JVM-subset used in Grail without the method/o-o stuff. The point of this VM is to have a more convenient basis for doing reasoning, while still being able to prove exact resource bounds. The semantics for Hume could be phrased directly in terms of GRUMPY, then showing equivalence btw HAM and GRUMPY or as translation function as used in Trans.thy (not finished, yet). *} subsection {* Function parameters, arguments and frames *} text {* Formal parameters of functions and actual arguments of functions are bound via these 2 relations *} types ParamType = "VarName list" types ArgType = "VarName list" text {* In the paper I just use function update over vectors; check if we can use this in the Isabelle theory, too. *} consts FrameInd :: "(ParamType \ ArgType \ Env \ Env) set" inductive FrameInd intros FrameInd_NIL: "([],[],E,emptyEnv):FrameInd" FrameInd_CONS: "\ (ps,as,E,E'):FrameInd; E''=fun_upd E' x (E y) \ \ (x # ps, y # as, E,E''):FrameInd" consts FrameIndHO :: "(ParamType \ (Ref list) \ Env \ Env) set" inductive FrameIndHO intros FrameIndHO_NIL: "([],[],E,emptyEnv):FrameIndHO" FrameIndHO_CONS: "\ (ps,rs,E,E'):FrameIndHO; E''=fun_upd E' x (R r) \ \ (x # ps, r # rs, E,E''):FrameIndHO" syntax bindArgs_ :: "[ParamType, ArgType, Env, Env] \ bool" ("_ <=| _ . _ = _ ") translations "ps <=| as . E = E'" == "(ps,as,E,E') : FrameInd" consts PConInd :: "(VarName list \ Ref list \ Env \ Env) set" inductive PConInd intros PConInd_NIL: "([], [], E, E):PConInd" PConInd_CONS: "\ (xs,rs,E,E'):PConInd; E''=fun_upd E' x (R r) \ \ (x # xs, r # rs, E, E''):PConInd" consts ConstrInd :: "(VarName list \ Ref list \ Env \ Heap \ Heap) set" inductive ConstrInd intros ConstrInd_NIL: "([], [], E, h, h):ConstrInd" ConstrInd_CONS: "\ (xs,rs,E,h,h):ConstrInd; (R r) = E x \ \ (x # xs, r # rs, E, h, h):ConstrInd" text {* A table matching function name to list of parameter types and the body *} types FunTable = "FunName \ (ParamType \ Exp)" consts funTab :: FunTable subsection {* GRUMPY Semantics *} text {* Big-step operational semantics, for patterns and for expressions. In a pattern, we have the location against which we are matching as additional argumetn. *} consts semmatch :: "(Env \ Heap \ Pattern \ Locn \ Env \ HoVal) set" -- {* operational semantics *} syntax semmatch_ :: "[Env, Heap, Pattern, Locn, Env, HoVal] \ bool" ("MATCH _, _ \ _ @ _ \ '(_, _ ')") translations "MATCH E, h \ e @ l \ (E',v)" == "(E,h,e,l,E',v) : semmatch" consts semexpn :: "(Env \ Heap \ Exp \ nat \ HoVal \ Heap \ Rescomp) set" -- {* operational semantics *} syntax semexpn_ :: "[Env, Heap, Exp, nat, HoVal, Heap, Rescomp] \ bool" (" _, _ \ _ \_ '(_ , _, _ ')") translations "E, h \ e \n (v,h',p)" == "(E,h,e,n,v,h',p) : semexpn" (* NB: Underapp only works on CallVar; need to assign the funid to a var first, if it's underapplied *) inductive semmatch intros (* Patterns *) semPVal: "\ fmap_lookup h l = Some w \ \ MATCH E, h \ (PVal w) @ l \ (E,R (Ref l))" semPValFail: "\ \ (fmap_lookup h l = Some w) \ \ MATCH E, h \ (PVal w) @ l \ (E,\)" semPVar: "MATCH E, h \ (PVar x) @ l \ (E(x:=(R (Ref l))),R (Ref l))" semPWild: "MATCH E, h \ (PWild i) @ l \ (E, R (Ref l))" semPCon: "\ \ rs . fmap_lookup h l = Some (C c rs) \ (vs, rs, E, E'):PConInd \ \ MATCH E, h \ (PCon c vs) @ l \ (E',R (Ref l))" semPConFail: "\ \ ( \ rs . fmap_lookup h l = Some (C c rs) ) \ \ MATCH E, h \ (PCon c vs) @ l \ (E,\)" inductive semexpn intros (* Expessions *) semValue: "E, h \ (ValueExp v) \1 (v, h, tickExp (ValueExp v) RCUndef)" semVar: "\ E x = v \ \ E, h \ (VarExp x) \1 (v,h,tickExp (VarExp x) RCUndef)" semConstr: "\ l = freshloc (fmap_dom h) ; (xs,rs,E,h,h'):ConstrInd; h'' = fmap_upd h' l (C c rs) \ \ E, h \ (ConstrExp c xs) \1 (R (Ref l),h'',tickExp (ConstrExp c xs) RCUndef)" semPrimBin: "\ i = E x ; j = E y ; v = f i j \ \ E, h \ (PrimBin f x y) \1 (v,h,tickExp (PrimBin f x y) RCUndef)" semRPrimBin: "\ R (Ref lx) = E x ; R (Ref ly) = E y ; fmap_lookup h lx = Some vx ; fmap_lookup h ly = Some vy ; v = f vx vy \ \ E, h \ (RPrimBin f x y) \1 (v,h,tickExp (RPrimBin f x y) RCUndef)" semIfTrue: "\ E x = B True ; E, h \ e1 \n (v, h',p')\ \ E, h \ (IfExp x e1 e2) \(Suc n) (v, h', p'\tickExp (IfExp x e1 e2) RCUndef)" semIfFalse: "\ E x = B False ; E, h \ e2 \n (v, h',p')\ \ E, h \ (IfExp x e1 e2) \(Suc n) (v, h', p'\tickExp (IfExp x e1 e2) RCUndef)" semLet: "\ E, h \ e1 \m (v,h',p'); E(x:=v), h' \ e2 \n (v'', h'',p'') \ \ E, h \ (LetExp x e1 e2) \(m+n) (v'', h'', p'\p''\tickExp (LetExp x e1 e2) RCUndef)" semCallFun: "\ ((fst (funTab f)), xs, E, E'):FrameInd ; E', h \ (snd (funTab f)) \n (v, h',p) \ \ E, h \ (CallFunExp f xs) \(Suc n) (v, h', p\tickExp (CallFunExp f xs) RCUndef)" semCallVarExact: "\ R (Ref (l::nat)) = E x ; Some (X f i rs) = fmap_lookup h l ; (as,e)=(funTab f); i+(length xs)=(length (fst (funTab f))); (fst (funTab f), rs@(map (\ x . theRef (E x)) xs), E, E'):FrameIndHO ; E', h \ snd (funTab f) \n (v, h',p) \ \ E, h \ (CallVarExp x xs) \(Suc n) (v, h', p\tickExp (CallVarExp x xs) RCUndef)" semCallVarUnderApp: "\ R (Ref (l::nat)) = E x ; Some (X f i rs) = fmap_lookup h l ; (as,e)=(funTab f); i+(length xs)<(length as); l' = freshloc (fmap_dom h); h' = fmap_upd h l' (X f (i+(length xs)) (rs@map (\ x . theRef (E x)) xs)) \ \ E, h \ (CallVarExp x xs) \1 (R (Ref l'), h', tickExp (CallVarExp x xs) RCUndef)" semCaseOneTrue: "\ R (Ref (l::nat)) = E x ; MATCH E, h \ b @ l \ (Ej, vj); vj\\ ; Ej, h \ e \n (v, h',p') \ \ E, h \ (CaseOneExp x b e e') \(n+1) (v, h', p'\tickExp (CaseOneExp x b e e') RCUndef)" semCaseOneFalse: "\ R (Ref (l::nat)) = E x ; MATCH E, h \ b @ l \ (Ej, vj); vj=\ ; E, h \ e' \n (v, h',p') \ \ E, h \ (CaseOneExp x b e e') \(n+1) (v, h', p'\tickExp (CaseOneExp x b e e') RCUndef)" (* tickExp (CaseOneExp x b e e') E h p')" *) text {* Assumes 0-cost pattern matching; needs to be refined! *} subsection {* Basic properties *} text {*We also provide elimination lemmas for the inductively defined relation*} inductive_cases semmatch_cases: "MATCH E, h \ PVal i @ l \ (E,v)" "MATCH E, h \ PVar x @ l \ (E,v)" "MATCH E, h \ PWild i @ l \ (E,v)" "MATCH E, h \ PCon c vs @ l \ (E,v)" inductive_cases semexpn_cases: "E, h \ (ValueExp i) \n (v,h',p')" "E, h \ (VarExp x) \n (v,h',p')" "E, h \ (PrimBin f x y) \n (v,h',p')" "E, h \ (RPrimBin f x y) \n (v,h',p')" "E, h \ (ConstrExp c x) \n (v,h',p')" "E, h \ (IfExp x e2 e3) \n (v,h',p')" "E, h \ (LetExp x e1 e2) \n (v,h',p')" "E, h \ (CallFunExp f xs) \n (v,h',p')" "E, h \ (CallVarExp x xs) \n (v,h',p')" "E, h \ (CaseOneExp x b e e') \n (v,h',p')" lemma no_zero_height_derivsAux: "\ E h h' v p'. E, h \ e \0 (v,h',p') \ False" apply (clarify) apply (induct e) apply (simp_all)? apply (elim semexpn_cases, insert Zero_not_Suc, fastsimp)+ apply (insert Suc_not_Zero, fastsimp) apply (elim semexpn_cases, insert Zero_not_Suc, fastsimp)+ apply (insert Zero_not_Suc, fastsimp) apply (elim semexpn_cases) apply simp apply (erule semexpn.cases) apply simp_all done text {* Operational semantics without height index *} constdefs semexp :: "[Env, Heap, Exp, HoVal, Heap, Rescomp] \ bool" (" _, _ \ _ \ '(_ , _, _ ')") "E, h \ e \ (v,h',p) \ (\ n. (E, h \ e \n (v,h',p)))" text {* The main rules, that show new language features, are semCallV.. and semCase. In semCallV we distinguish between exact-, under and over-app, and we need a closure as value for the function variable. Either a new closure with the additional value is built (underapp) or the body is executed (exactapp). This doesn't reflect the closure-chains as used in the HAM. But maybe these can be accounted for just in the cost. In semCase we go over all branches, require that branches 1..j-1 do not match, and execute the body of the j-th (ie. matching) branch. Costs are more complicated here, but the Hume Op Sem D spells this out in mpre detail anyway. *} subsection {* Program Logic *} text {* Again a VDM style program logic, using a shallow embedding into Isabelle/HOL. Partial correctness. We could later adapt the termination logic and bring it into this project, since there is no stand-alone publication on this material so far. *} types Assertion = "Env \ Heap \ Heap \ HoVal \ Rescomp \ bool" types Context = "(Exp \ Assertion) set" (* types PattContext = "(Pattern \ VarName \ Assertion) set" *) consts vdm :: "(Context \ Exp \ Assertion) set" -- {* VDM-style program logic *} syntax vdm_ :: "[Context, Exp, Assertion] \ bool" (" _ \ _ : _") translations "G \ e : P" == "(G,e,P) : vdm" consts vdmpat :: "(Context \ Pattern \ VarName \ Assertion) set" syntax vdmpat_ :: "[Context, Pattern, VarName, Assertion] \ bool" ("MATCH _ \ _ @ _ : _") translations "MATCH G \ p @ x : A" == "(G,p,x,A) : vdmpat" text {* Note: vdmpat is UNUSED; the vdm rules sempat directly *} inductive vdmpat intros (* Patterns *) vdmPVal: "MATCH G \ (PVal v) @ x : \ E h hh v p. (\ l. R (Ref l) = E x \ fmap_lookup h l = Some v)" vdmPVar: "MATCH G \ (PVar y) @ x : \ E h hh v p. E x = E y" vdmPWild: "MATCH G \ (PWild i) @ x : \ E h hh v p. h = hh" vdmPCon: "MATCH G \ (PCon c ys) @ x : \ E h hh v p. (\ l rs. R (Ref l) = E x \ fmap_lookup h l = Some (C c rs) \ (\ (i::nat). i<(length rs) \ E (nth ys i) = R (nth rs i)))" text {* aux defs used in vdmCallVar *} (* this is \ in the paper *) constdefs preUnderApp :: "Env \ Heap \ Heap \ HoVal \ VarName \ (VarName list) \ bool" "preUnderApp \ \ E h hh v x xs. (\ l l' f i rs. ((E x)=(R (Ref l)) \ (fmap_lookup h l)=(Some (X f i rs)) \ i+(length xs)<(length (fst (funTab f))) \ l'=freshloc (fmap_dom h) \ v=R (Ref l') \ hh=fmap_upd h l' (X f (i+(length xs)) (rs@map (\ x . theRef (E x)) xs))))" (* this is \ in the paper *) constdefs preExactApp :: "Env \ Heap \ Heap \ HoVal \ FunName \ (Ref list) \ VarName \ (VarName list) \ bool" "preExactApp \ \ E' h hh v f rs x xs. (\ l i . ((E' x)=(R (Ref l)) \ (fmap_lookup h l)=(Some (X f i rs)) \ (i+(length xs)=length (fst (funTab f)))))" inductive vdm intros (* Expessions *) vdmValue: "G \ ValueExp w : \ E h hh v p. (v=w \ h=hh \ p=tickExp (ValueExp w) RCUndef)" vdmVar: "G \ VarExp x : \ E h hh v p. (v=E x \ h=hh \ p=tickExp (VarExp x) RCUndef)" vdmConstr: "G \ ConstrExp c xs : \ E h hh v p. (\ l rs h'. l = freshloc (fmap_dom h) \ (xs,rs,E,h,h'):ConstrInd \ v=R (Ref l) \ hh = fmap_upd h' l (C c rs) \ p=tickExp (ConstrExp c xs) RCUndef)" vdmPrimBin: "G \ PrimBin f x y : \ E h hh v p. (\ i j. E x = i \ E y = j \ v = f i j \ h=hh \ p=tickExp (PrimBin f x y) RCUndef)" vdmRPrimBin: "G \ RPrimBin f x y : \ E h hh v p. (\ lx ly vx vy. R (Ref lx) = E x \ R (Ref ly) = E y \ fmap_lookup h lx = Some vx \ fmap_lookup h ly = Some vy \ v = f vx vy \ h=hh \ p=tickExp (RPrimBin f x y) RCUndef)" vdmIf: "\ G \ e1 : P1 ; G \ e2 : P2 \ \ G \ (IfExp x e1 e2) : \ E h hh v p. (((E x=B True \ (\ p'. P1 E h hh v p' \ p=(p'\tickExp (IfExp x e1 e2) RCUndef))) \ (E x=B False \ (\ p'. P2 E h hh v p' \ p=(p'\tickExp (IfExp x e1 e2) RCUndef)))))" vdmLet: "\ G \ e1 : P1 ; G \ e2 : P2 \ \ G \ LetExp x e1 e2 : \ E h hh v p. \ v' h' p' p''. ((P1 E h h' v' p') \ (P2 (fun_upd E x v') h' hh v p'') \ (p=(p'\p''\tickExp (LetExp x e1 e2) RCUndef)))" vdmCallFun: "\ insert (CallFunExp f xs , P) G \ snd (funTab f) : \ E h hh v p. (\ E'. (fst (funTab f),xs,E',E):FrameInd \ (P E' h hh v (p\tickExp (CallFunExp f xs) RCUndef))) \ \ G \ CallFunExp f xs : P" vdmCallVar: "\ (\ E h hh v . preUnderApp E h hh v x xs \ P E h hh v (tickExp (CallVarExp x xs) RCUndef)); (\ f. insert (CallVarExp x xs, P) G \ snd (funTab f) : (\ E h hh v p. (\ E'. (\ rs. preExactApp E' h hh v f rs x xs \ (fst (funTab f), rs@(map (\ x . theRef (E' x)) xs), E', E):FrameIndHO) \ P E' h hh v (p\tickExp (CallVarExp x xs) RCUndef)) )) \ \ G \ CallVarExp x xs : P" vdmCaseOne: "\ G \ e : P ; G \ e' : P' \ \ G \ CaseOneExp x b e e' : (\ E h hh v p . \ (l::Locn). R (Ref l) = E x \ (\ E' v'. MATCH E, h \ b @ l \ (E',v') \ ((v'=\ \ (\ p'. P' E h hh v p' \ p=(p'\tickExp (CaseOneExp x b e e') RCUndef))) \ (v'\\ \ (\ p'. P E' h hh v p' \ p=(p'\tickExp (CaseOneExp x b e e') RCUndef))))))" vdmAx: "\ (e,P):G \ \ G \ e :P" vdmConseq: "\ \ E h h' v p. P E h h' v p \ Q E h h' v p ; G \ e : P \ \ G \ e : Q" (* lemma bonzo_13: "\ xs rs n E h h' . (xs,rs,n,E,h,h'):ConstrInd \ (\ (i::nat). i E (nth xs i) = R (nth rs i))" apply (rule allI)+ apply (rule impI) apply (rule_tac ConstrInd.induct) defer 1 apply clarsimp apply clarify apply (case_tac "i=na") apply clarsimp *) (* UNUSED The judgement for patterns contains as rightmost element an assertion, induced by the pattern, under which the rhs of the branch must be true (see Case). *) (* lemmas "vdmCase": "\ \ (i::nat). (i < length bs) \ (\ Q. (MATCH G \ fst (nth bs i) @ x : Q) \ ((G \ snd (nth bs i) : (\ E h hh v p . Q E h hh v p \ P E h hh v p)))) \ \ G \ CaseExp x bs : P" oops *) (* vdmCase: "\ \ i . i<(length bs) \ (\ G' . MATCH G \ fst (nth bs i) @ x : G' \ G' \ snd (nth bs i) : P) \ \ G \ (CaseExp x bs) : P " *) (* \(n+m+1) (v', h'', tickExp (CaseExp x bs) E h p)" *) (* vdmCallV: "\ \ as e . (G \ e : (\ E h hh v p. (\ l f i vs E' p'. (((E x)=(R (Ref l)) \ (fmap_lookup h l)=(Some (X f i vs)) \ (as,e)=(funTab f) \ (as,vs@(map (\ x. theRef (E' x)) xs),E',E):FrameIndHO) \ P E' h v p (tickExp (CallVarExp x xs) E h p))))) \ \ G \ CallVarExp x xs : P" *) text {* Validity *} constdefs validn :: "nat \ Exp \ Assertion \ bool" ("\\<^sub>_ _ : _" 50) "\\<^sub>n e : P \ (\ m . m \ n \ (\ E h h' v p . ((E, h \ e \m (v,h',p)) \ P E h h' v p)))" constdefs valid :: "Exp \ Assertion \ bool" ("\ _ : _" 50) "\ e : P \ (\ E h h' v p . ((E, h \ e \ (v,h',p)) \ P E h h' v p))" constdefs ctxt_validn::"nat \ Context \ bool" ("|\\<^sub>_ _" 60) "|\\<^sub>n G \ (\ (e,P) \ G . \\<^sub>n e : P)" constdefs ctxt_valid::" Context \ bool" ("|\ _" 60) "|\ G \ (\ (e,P) \ G . \ e : P)" constdefs valid_in_ctxt :: " Context \ Exp \ Assertion \ bool" ("_ \ _ : _" 75) "G \ e : P \ ( |\ G ) \ (\ e:P)" constdefs valid_in_ctxt_n :: " Context \ nat \ Exp \ Assertion \ bool" ("_ \\<^sub> _ _ : _" 75) "G \\<^sub>n e : P \ ( |\\<^sub>n G ) \ ( \\<^sub>n e:P)" (* top-level validity statement, used in the paper version of the soundness statement *) constdefs testme :: " Context \ Exp \ Assertion \ bool" ("TESTME _ \ _ : _" 75) "TESTME G \ e : P \ \ n. ((\ (e,P) \ G . \\<^sub>n e : P) \ ( \\<^sub>n e:P))" text {* Simple lemmas over variants of the validity statement. *} lemma valid_validn: "\ e : P \ \\<^sub>n e : P" apply (simp add: valid_def validn_def semexp_def) apply (fastsimp) done lemma validn_valid: "(\ n . \\<^sub>n e : P) \ \ e : P" apply (simp add: valid_def validn_def semexp_def) apply (fastsimp) done lemma ctxt_valid_validn: "( |\ G) \ (\ n.( |\\<^sub>n G))" apply (simp add: ctxt_validn_def ctxt_valid_def) apply clarsimp apply (auto elim: valid_validn) done lemma emptyctxn [simp]: "|\\<^sub>n {}" apply (simp add: ctxt_validn_def) done lemma ctxt_projn[rule_format]: "(e,P) \ G \ |\\<^sub>n G \ (\\<^sub>n e : P)" apply (simp add: ctxt_validn_def) apply (fastsimp) done lemma ctxt_drop: "( |\ {(e,P)} \ G) \ |\ G" apply (simp add: ctxt_valid_def) done lemma ctxt_ext[simp]: "( |\ {(e,P)} \ G) = ((\ e : P ) \ ( |\ G))" apply (simp add: ctxt_valid_def) done lemma empty_ctxt [simp]: "|\ {}" apply (simp add: ctxt_valid_def) done lemma ctxt_subn[rule_format]: "H \ G \ |\\<^sub>n G \ |\\<^sub>n H" apply (simp add: ctxt_validn_def validn_def) apply (fast) done lemma ctxt_cons: "\ |\ G; \ e : P\ \ |\ G \ {(e,P)}" apply (simp add: ctxt_valid_def) done lemma ctxt_validn_valid[rule_format]: "(\ n. |\\<^sub>n G) \ |\ G" apply (simp add: ctxt_validn_def ctxt_valid_def valid_def validn_def semexp_def) apply (fastsimp) done lemma ctxt_valid_validn: "|\ G \ (\ n. |\\<^sub>n G)" apply (simp add: ctxt_validn_def ctxt_valid_def valid_def validn_def semexp_def) apply (fastsimp) done lemma lowerm: "\ m < n; \\<^sub>n e:P \ \ \\<^sub>m e : P" apply (simp add: validn_def) apply clarsimp apply (subgoal_tac "ma < n") prefer 2 apply simp apply (erule_tac thin_rl) apply (erule_tac x="ma" in allE) apply simp done lemma lowerm_suc: "\ \\<^sub>(Suc n) e:P \ \ \\<^sub>n e : P" (*<*) apply (simp add: validn_def) apply clarsimp apply (erule_tac x="m" in allE) apply simp done (*>*) lemma ctxt_lower: "\ |\\<^sub>n G; m \ |\\<^sub>m G" (*<*) apply (simp add: ctxt_validn_def) apply clarsimp apply (rule lowerm) apply fastsimp+ done (*>*) (* lemmas ctxt_lower_suc = ctxt_lower [of "Suc n" G n]; *) lemma ctxt_lower_suc: "\ |\\<^sub>(Suc n) G \ \ |\\<^sub>n G" (*<*) apply (simp add: ctxt_validn_def) apply clarsimp apply (rule lowerm) apply fastsimp+ done (*>*) lemma ctxt_consn: "\ |\\<^sub>n G; \\<^sub>n e:P \ \ ( |\\<^sub>n {(e,P)} \ G)" (*<*)by (simp add: ctxt_validn_def)(*>*) lemma ctxt_insertn: "\ |\\<^sub>n G; \\<^sub>n e:P \ \ ( |\\<^sub>n (insert (e,P) G))" (*<*)by (simp add: ctxt_validn_def)(*>*) (* constdefs ctxt_validn :: "nat \ Context \ bool" (" |\\<^sub>_ _ " [900,900] 900) "ctxt_validn n G == \ e P. (e,P):G \ \\<^sub>n e : P" "ctxt_validn n G == \ eg Ag. (eg,Ag):G \ (\ E h h' v p . E, h \ eg \n (v,h',p) \ Ag E h hh v p \ E, h \ e \n (v,h',p) \ P E h hh v p)" constdefs valid_in_ctxt :: "Context \ Exp \ Assertion \ bool" ("_ \ _ : _") "valid_in_ctxt G e P == \ n. |\\<^sub>n G \ \\<^sub>n e : P" "valid G e P == \ eg Ag. (eg,Ag):G \ (\ E h h' v p n . E, h \ eg \n (v,h',p) \ Ag E h hh v p \ E, h \ e \n (v,h',p) \ P E h hh v p)" syntax valid :: "Exp \ Assertion \ bool" ("\ _ : _") translations "\ e : P" == "valid e P" constdefs valid :: "Exp \ Assertion \ bool" ("\ _ : _") "valid e P == (\ \ e : P)" *) lemma bonzo_10[rule_format]: "\ rs E E' E''. (xs,rs,E,E'):PConInd \ (xs,rs,E,E''):PConInd \ E'=E''" apply (induct_tac xs) apply clarsimp apply (erule_tac PConInd.cases) apply simp_all apply (erule_tac PConInd.cases) apply simp_all apply clarsimp apply (rotate_tac -1) apply (erule_tac PConInd.cases) apply simp_all apply (rotate_tac -4) apply (erule_tac PConInd.cases) apply simp_all apply clarsimp apply (erule_tac x="rsb" in allE) apply (erule_tac x="Eb" in allE) apply (erule_tac x="E'a" in allE) apply (erule impE) apply assumption apply (erule_tac x="E'b" in allE) apply clarsimp done lemma bonzo_11[rule_format]: "\ E h l E' E'' v' v''. MATCH E, h \ b @ l \ (E', v') \ MATCH E, h \ b @ l \ (E'', v'') \ E'=E'' \ v'=v''" apply (case_tac b) apply simp_all apply clarsimp apply (erule semmatch.cases) apply simp_all apply (erule semmatch.cases) apply simp_all (* PVal *) apply clarsimp apply (erule semmatch.cases) apply simp_all apply (erule semmatch.cases) apply simp_all apply clarsimp apply (erule semmatch.cases) apply simp_all (* PCon *) defer 1 (* PWild *) apply clarsimp apply (erule semmatch.cases) apply simp_all apply clarsimp apply (erule semmatch.cases) apply simp_all apply clarsimp (* PCon *) apply clarsimp? apply (erule semmatch.cases) apply simp_all apply clarsimp apply (erule semmatch.cases) apply simp_all apply clarsimp apply (drule bonzo_10) apply fastsimp apply assumption apply clarsimp apply (erule semmatch.cases) apply simp_all done lemma bonzo_21[rule_format] :"\ l l' E x . R (Ref l) = E x \ R (Ref l') = E x \ l = l' " apply clarsimp apply (case_tac "E x = R (Ref l)") apply fastsimp apply fastsimp done subsection {* Soundness of the VDM-style logic *} text {* Aux lemmas for soundness theorem *} (* lemma callsound00: "\ e P G. ((e, P) \ G \ ( \n. ( ( |\\<^sub>n G) \ (\m. (m \ n \ (\ E h h' v p. (E, h \ e \m (v, h', p) \ P E h h' v p)))))))" apply (rule allI)+ apply (rule impI) apply (rule allI) apply (rule impI) apply (subgoal_tac "\\<^sub>n e : P") apply (simp add: ctxt_validn_def validn_def) apply (simp add: ctxt_validn_def, fastsimp) done lemma callsound01: "\ f xs e P G. ((e, P) \ G \ (\n. ( ( |\\<^sub>n G) \ (G \ CallFunExp f xs : P) \ (\m. m \ n \ G \\<^sub>m e : P) \ G \\<^sub>n CallFunExp f xs : P )))" apply (rule allI)+ apply (rule impI) apply (rule allI) apply (induct_tac n) apply clarsimp apply (erule thin_rl) apply (erule thin_rl) apply (erule thin_rl) apply (insert no_zero_height_derivsAux) apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) (* recursion case *) apply (rotate_tac -1) apply (erule thin_rl) apply clarsimp apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) apply clarsimp sorry lemma callsound02: "\ n. (\m. m \ n \ (insert (CallFunExp f xs, P) G) \\<^sub>m (snd (funTab f)) : \ E h hh v p. (\ E'. ((fst (funTab f)),xs,E',E):FrameInd \ (P E' h hh v (tickExp (CallFunExp f xs) E h p)))) \ G \\<^sub>n CallFunExp f xs : P " apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) apply clarsimp apply (erule semexpn.cases) apply simp_all apply clarsimp oops *) lemma validn_valid_in_ctxt[rule_format]: "(\ n. G \\<^sub>n e : P) \ G \ e : P" apply clarsimp apply (simp add: valid_in_ctxt_def) apply clarsimp apply (rule validn_valid) apply (simp add: valid_in_ctxt_n_def) apply clarsimp apply (erule_tac x="n" in allE) apply (erule impE) apply (frule ctxt_valid_validn) apply (erule_tac x="n" in allE) apply assumption apply assumption done (* lemma valid_validn_in_ctxt[rule_format]: " G \ e : P \ (\ n. G \\<^sub>n e : P)" apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def) apply clarsimp apply (rule valid_validn) apply (erule impE) defer 1 apply assumption apply (simp only: ctxt_valid_def ctxt_validn_def) apply clarify oops *) (* lemma CallFunSoundAux: "\ \ as e . (as, e)=(funTab f) \ insert (CallFunExp f xs , P) G \ e : \ E h hh v p. (\ E'. (as,xs,E',E):FrameInd \ (P E' h hh v (tickExp (CallFunExp f xs) E h p))) ; G \ CallFunExp f xs : P \ \ (\ n . G \\<^sub>n e : P)" apply (rule allI) apply (insert callsound00) apply (induct_tac n) apply (insert no_zero_height_derivsAux) apply fast (* recursion case *) apply (rotate_tac -1) apply (simp add: valid_in_ctxt_def ctxt_validn_def valid_def validn_def) apply clarify (* apply (simp add: semexp_def) *) (* apply (erule exE) *) apply (erule semexpn.cases) apply simp_all apply clarsimp oops *) lemma soundnessAux: "G \ e : P \ (\ n. G \\<^sub>n e : P)" apply (erule vdm.induct) (* ValueExp *) apply clarify apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) apply clarsimp apply (erule semexpn.cases) apply simp_all (* apply (simp add: valid_in_ctxt_def ctxt_validn_def valid_def validn_def) apply clarsimp apply (simp add: tickExp_def) *) (* done with ValueExp *) (* VarExp *) apply clarify apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) apply clarsimp apply (erule semexpn.cases) apply simp_all (* done with VarExp *) (* ConstrExp *) apply clarify apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) apply clarsimp apply (erule semexpn.cases) apply simp_all apply clarsimp apply (rule_tac x="rs" in exI) apply (rule_tac x="h'a" in exI) apply clarsimp (* done with ConstrExp *) (* PrimBin *) apply clarify apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) apply clarsimp apply (erule semexpn.cases) apply simp_all (* done with PrimBin *) (* RPrimBin *) apply clarify apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) apply clarsimp apply (erule semexpn.cases) apply simp_all apply (rule_tac x="lx" in exI) apply clarsimp apply (rule_tac x="ly" in exI) apply clarsimp (* done with RPrimBin *) (* IfExp *) apply clarify apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def valid_def validn_def) apply clarsimp apply (erule semexpn.cases) apply simp_all apply (erule thin_rl) apply (rule_tac x="p'" in exI) apply (rule conjI) apply clarify apply (erule_tac x="n" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (erule thin_rl) apply (erule thin_rl) apply (erule thin_rl) apply (rotate_tac -1) apply (erule_tac x="na" in allE) apply (rotate_tac -1) apply (erule impE) apply simp apply (rotate_tac -1) apply (erule_tac x="Ea" in allE) apply (rotate_tac -1) apply (erule_tac x="ha" in allE) apply (rotate_tac -1) apply (erule_tac x="h'a" in allE) apply (rotate_tac -1) apply (erule_tac x="va" in allE) apply (rotate_tac -1) apply (erule_tac x="p'" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply assumption apply simp (* subcase: False *) apply clarify apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def valid_def validn_def) apply clarsimp? apply (rule_tac x="p'" in exI) apply (rule conjI) apply clarify? apply (erule thin_rl) apply (erule thin_rl) apply (erule thin_rl) apply (erule_tac x="n" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (erule_tac x="na" in allE) apply (rotate_tac -1) apply (erule impE) apply simp apply (rotate_tac -1) apply (erule_tac x="Ea" in allE) apply (rotate_tac -1) apply (erule_tac x="ha" in allE) apply (rotate_tac -1) apply (erule_tac x="h'a" in allE) apply (rotate_tac -1) apply (erule_tac x="va" in allE) apply (rotate_tac -1) apply (erule_tac x="p'" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply assumption apply simp (* done with IfExp *) (* LetExp *) apply clarify apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def valid_def validn_def) apply clarsimp apply (erule semexpn.cases) apply simp_all apply (rule_tac x="va" in exI) apply (rule_tac x="h'a" in exI) apply (rule_tac x="p'" in exI) apply (erule_tac x="n" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (rotate_tac -1) apply (erule_tac x="ma" in allE) apply (rotate_tac -1) apply (erule impE) apply simp apply (rotate_tac -1) apply (erule_tac x="Ea" in allE) apply (rotate_tac -1) apply (erule_tac x="ha" in allE) apply (rotate_tac -1) apply (erule_tac x="h'a" in allE) apply (rotate_tac -1) apply (erule_tac x="va" in allE) apply (rotate_tac -1) apply (erule_tac x="p'" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (rule conjI) apply assumption apply (rule_tac x="p''" in exI) apply (rule conjI) apply (erule_tac x="n" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (rotate_tac -1) apply (erule_tac x="na" in allE) apply (rotate_tac -1) apply (erule impE) apply simp apply (rotate_tac -1) apply (erule_tac x="Ea(xa := va)" in allE) apply (rotate_tac -1) apply (erule_tac x="h'a" in allE) apply (rotate_tac -1) apply (erule_tac x="h''" in allE) apply (rotate_tac -1) apply (erule_tac x="v''" in allE) apply (rotate_tac -1) apply (erule_tac x="p''" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply assumption apply clarsimp (* done with LetExp *) (* ToDos: CallFunExp, CallVarExp, CaseExp *) (* CallFunExp *) apply clarsimp apply (erule thin_rl) apply (induct_tac n) apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) apply (insert no_zero_height_derivsAux) apply fast (* recursion case *) apply (rotate_tac -1) apply (erule thin_rl) apply (simp (no_asm) add: valid_in_ctxt_def valid_in_ctxt_n_def) apply clarsimp apply (simp (no_asm) add: valid_def validn_def) apply clarsimp apply (erule semexpn.cases) apply simp_all apply clarsimp apply (erule_tac x="na" in allE) apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def) apply (erule impE) apply (rule ctxt_lower) apply simp apply simp apply (erule impE) apply (drule ctxt_lower_suc) apply (erule thin_rl) apply (erule thin_rl) apply (erule thin_rl) apply (drule ctxt_consn) apply simp apply simp apply (simp only: valid_def validn_def) (* done with CallFunExp *) (* TODOs: CallVarExp, CaseExp, structural rules *) defer 1 defer 1 (* vdmAx rule *) apply clarify apply (rotate_tac -1) apply (erule thin_rl) apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) apply fastsimp (* vdmConseq rule *) apply clarify apply (rotate_tac -1) apply (erule thin_rl) apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) (* TODOs: CallVarExp, CaseExp *) defer 1 (* CaseOneExp *) apply (rotate_tac -1) apply (erule thin_rl) apply clarify apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def valid_def validn_def) apply clarsimp apply (case_tac b) apply simp_all (* NB: all pattern-cases uses exactly the same proof script *) (* PVar *) apply (erule semexpn.cases) apply simp_all apply clarsimp apply (subgoal_tac "l=la") apply clarsimp apply (drule bonzo_11) apply fastsimp apply (erule_tac x="n" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (rotate_tac -1) apply (erule_tac x="na" in allE) apply (rotate_tac -1) apply (erule impE) apply simp apply (rotate_tac -1) apply (erule_tac x="Ej" in allE) apply (rotate_tac -1) apply (erule_tac x="ha" in allE) apply (rotate_tac -1) apply (erule_tac x="h'a" in allE) apply (rotate_tac -1) apply (erule_tac x="va" in allE) apply (rotate_tac -1) apply (erule_tac x="p'" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply simp (* instantiate intermediate p *) apply clarsimp apply (rule_tac x="p'" in exI) apply clarsimp apply (rule bonzo_21) (* l=la *) apply simp apply (subgoal_tac "l=la") apply clarsimp apply (drule bonzo_11) apply fastsimp apply (erule thin_rl) apply (erule thin_rl) apply (erule_tac x="n" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (rotate_tac -1) apply (erule_tac x="na" in allE) apply (rotate_tac -1) apply (erule impE) apply simp apply (rotate_tac -1) apply (erule_tac x="Ea" in allE) apply (rotate_tac -1) apply (erule_tac x="ha" in allE) apply (rotate_tac -1) apply (erule_tac x="h'a" in allE) apply (rotate_tac -1) apply (erule_tac x="va" in allE) apply (rotate_tac -1) apply (erule_tac x="p'" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply simp (* instantiate intermediate p *) apply clarsimp apply (rule_tac x="p'" in exI) apply clarsimp apply (rule bonzo_21) (* l=la *) apply simp (* PVal *) apply (erule semexpn.cases) apply simp_all apply clarsimp apply (subgoal_tac "l=la") apply clarsimp apply (drule bonzo_11) apply fastsimp apply (erule_tac x="n" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (rotate_tac -1) apply (erule_tac x="na" in allE) apply (rotate_tac -1) apply (erule impE) apply simp apply (rotate_tac -1) apply (erule_tac x="Ej" in allE) apply (rotate_tac -1) apply (erule_tac x="ha" in allE) apply (rotate_tac -1) apply (erule_tac x="h'a" in allE) apply (rotate_tac -1) apply (erule_tac x="va" in allE) apply (rotate_tac -1) apply (erule_tac x="p'" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply simp (* instantiate intermediate p *) apply clarsimp apply (rule_tac x="p'" in exI) apply clarsimp apply (rule bonzo_21) (* l=la *) apply simp (* Fail *) apply (subgoal_tac "l=la") apply clarsimp apply (drule bonzo_11) apply fastsimp apply (erule thin_rl) apply (erule thin_rl) apply (erule_tac x="n" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (rotate_tac -1) apply (erule_tac x="na" in allE) apply (rotate_tac -1) apply (erule impE) apply simp apply (rotate_tac -1) apply (erule_tac x="Ea" in allE) apply (rotate_tac -1) apply (erule_tac x="ha" in allE) apply (rotate_tac -1) apply (erule_tac x="h'a" in allE) apply (rotate_tac -1) apply (erule_tac x="va" in allE) apply (rotate_tac -1) apply (erule_tac x="p'" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply simp (* instantiate intermediate p *) apply clarsimp apply (rule_tac x="p'" in exI) apply clarsimp apply (rule bonzo_21) (* l=la *) apply simp (* PCon *) apply (erule semexpn.cases) apply simp_all apply clarsimp apply (subgoal_tac "l=la") apply clarsimp apply (drule bonzo_11) apply fastsimp apply (erule_tac x="n" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (rotate_tac -1) apply (erule_tac x="na" in allE) apply (rotate_tac -1) apply (erule impE) apply simp apply (rotate_tac -1) apply (erule_tac x="Ej" in allE) apply (rotate_tac -1) apply (erule_tac x="ha" in allE) apply (rotate_tac -1) apply (erule_tac x="h'a" in allE) apply (rotate_tac -1) apply (erule_tac x="va" in allE) apply (rotate_tac -1) apply (erule_tac x="p'" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply simp (* instantiate intermediate p *) apply clarsimp apply (rule_tac x="p'" in exI) apply clarsimp apply (rule bonzo_21) (* l=la *) apply simp (* Fail *) apply (subgoal_tac "l=la") apply clarsimp apply (drule bonzo_11) apply fastsimp apply (erule thin_rl) apply (erule thin_rl) apply (erule_tac x="n" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (rotate_tac -1) apply (erule_tac x="na" in allE) apply (rotate_tac -1) apply (erule impE) apply simp apply (rotate_tac -1) apply (erule_tac x="Ea" in allE) apply (rotate_tac -1) apply (erule_tac x="ha" in allE) apply (rotate_tac -1) apply (erule_tac x="h'a" in allE) apply (rotate_tac -1) apply (erule_tac x="va" in allE) apply (rotate_tac -1) apply (erule_tac x="p'" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply simp (* instantiate intermediate p *) apply clarsimp apply (rule_tac x="p'" in exI) apply clarsimp apply (rule bonzo_21) (* l=la *) apply simp (* PWild *) apply (erule semexpn.cases) apply simp_all apply clarsimp apply (subgoal_tac "l=la") apply clarsimp apply (drule bonzo_11) apply fastsimp apply (erule_tac x="n" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (rotate_tac -1) apply (erule_tac x="na" in allE) apply (rotate_tac -1) apply (erule impE) apply simp apply (rotate_tac -1) apply (erule_tac x="Ej" in allE) apply (rotate_tac -1) apply (erule_tac x="ha" in allE) apply (rotate_tac -1) apply (erule_tac x="h'a" in allE) apply (rotate_tac -1) apply (erule_tac x="va" in allE) apply (rotate_tac -1) apply (erule_tac x="p'" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply simp (* instantiate intermediate p *) apply clarsimp apply (rule_tac x="p'" in exI) apply clarsimp apply (rule bonzo_21) (* l=la *) apply simp (* Fail *) apply (subgoal_tac "l=la") apply clarsimp apply (drule bonzo_11) apply fastsimp apply (erule thin_rl) apply (erule thin_rl) apply (erule_tac x="n" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (rotate_tac -1) apply (erule_tac x="na" in allE) apply (rotate_tac -1) apply (erule impE) apply simp apply (rotate_tac -1) apply (erule_tac x="Ea" in allE) apply (rotate_tac -1) apply (erule_tac x="ha" in allE) apply (rotate_tac -1) apply (erule_tac x="h'a" in allE) apply (rotate_tac -1) apply (erule_tac x="va" in allE) apply (rotate_tac -1) apply (erule_tac x="p'" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply simp (* instantiate intermediate p *) apply clarsimp apply (rule_tac x="p'" in exI) apply clarsimp apply (rule bonzo_21) (* l=la *) apply simp (* TODOs: CallVarExp *) apply clarsimp apply (induct_tac n) apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) (* recursion case *) apply (rotate_tac -2) apply (erule thin_rl) apply (simp (no_asm) add: valid_in_ctxt_def valid_in_ctxt_n_def) apply clarsimp apply (simp (no_asm) add: valid_def validn_def) apply clarsimp apply (erule semexpn.cases) apply simp_all (* subcase: ExactApp *) apply clarsimp (* apply (erule_tac x="snd (funTab f)" in allE) *) apply (erule_tac x="f" in allE) apply clarsimp apply (rotate_tac -2) apply (erule thin_rl) apply (erule_tac x="na" in allE) apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def) apply (erule impE) apply (rule ctxt_lower) apply simp apply simp apply (erule impE) apply (drule ctxt_lower_suc) apply (drule ctxt_consn) apply simp apply (subgoal_tac "{(CallVarExp xa xsa, P)} \ G = insert (CallVarExp xa xsa, P) G") apply simp apply simp apply (erule thin_rl) apply (simp add: valid_def validn_def) apply (rotate_tac -1) apply (erule_tac x="n" in allE) apply (rotate_tac -1) apply (erule impE) apply assumption apply (erule_tac x="E'" in allE) apply (erule_tac x="ha" in allE) apply (erule_tac x="h'a" in allE) apply (erule_tac x="va" in allE) apply (erule_tac x="pa" in allE) apply (erule impE) apply assumption apply (rotate_tac -1) apply (erule_tac x="Ea" in allE) apply (rotate_tac -1) apply (erule impE) apply (rule_tac x="rs" in exI) apply (rule conjI) apply (simp only: preExactApp_def) apply (rule_tac x="l" in exI) apply (rule_tac x="i" in exI) apply (rule conjI) apply clarsimp apply clarsimp apply (assumption) apply assumption (* subcase: UnderApp *) apply clarsimp apply (erule thin_rl) apply (rotate_tac 1) apply (erule thin_rl) apply (erule thin_rl) apply (erule_tac x="Ea" in allE) apply (erule_tac x="ha" in allE) apply (erule_tac x="(ha(freshloc (fmap_dom ha)\\<^sub>fX f (i + length xsa) (rs @ map (\x. theRef (Ea x)) xsa)))" in allE) apply (erule_tac x="(R (Ref (freshloc (fmap_dom ha))))" in allE) (* apply (erule_tac x="pa" in allE) *) apply (erule impE) apply (simp only: preUnderApp_def) apply (rule_tac x="l" in exI) apply (rule_tac x="freshloc (fmap_dom ha)" in exI) apply (rule_tac x="f" in exI) apply (rule_tac x="i" in exI) apply (rule_tac x="rs" in exI) apply clarsimp apply (subgoal_tac "funTab f=(as,e)") apply simp apply fastsimp apply assumption done text {* Main Soundness theorem Structure of the proof: induction over vdm rules, and induction over n in case of function calls (same as for Grail, mapping all Call? cases of GRUMPY to Grail static methods. *} theorem "soundness": "G \ e : P \ G \ e : P" apply (drule soundnessAux) apply (rule validn_valid_in_ctxt) apply (erule_tac x="n" in allE) apply assumption done text {* Finally, soundness in empty contexts. *} theorem "soundness1": "{} \ e : P \ {} \ e : P" apply (insert soundness [of "{}"]) apply (simp add: valid_in_ctxt_def validn_def valid_def) (* sem_def *) apply fast done text {* Same result in a slightly different flavour, exactly as used in D17 *} lemma t1: "TESTME G \ e : P \ \ n. G \\<^sub>n e : P" apply (simp add: testme_def) apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) done lemma t2: "\ n. G \\<^sub>n e : P \ TESTME G \ e : P" apply (simp add: testme_def) apply (simp add: valid_in_ctxt_def valid_in_ctxt_n_def ctxt_validn_def valid_def validn_def) done lemma s1: "G \ e : P \ TESTME G \ e : P" apply (drule soundnessAux) apply (rule t2) apply simp done theorem "{} \ e : P \ TESTME {} \ e : P" apply (insert s1 [of "{}"]) apply (simp add: valid_in_ctxt_def validn_def valid_def testme_def) (* sem_def *) apply fast done (* collections of lemmas *) lemmas vdm_basics = vdmValue vdmVar vdmConstr vdmPrimBin vdmIf vdmLet vdmCallFun vdmCallVar vdmCaseOne vdmAx vdmConseq lemmas vdm_structural = vdmAx vdmConseq lemmas vdm_calls = vdmCallFun vdmCallVar lemmas vdm_pathetic = vdmValue vdmVar vdmConstr vdmPrimBin vdmRPrimBin text {* Next steps after proving soundness: design derived assertions, mapping resource info on stack, heap and time into this logic. What we need for the first D is a description of the assertion language, ie. motivate the usage of Isabelle/HOL and a shallow embedding. Also, examples showing how resource info is mapped down would be useful. And a discussion of how GRUMPY maps down to HAM. I started work on a translation function in Isabelle, but that needs more work. A discussion of such a translation, covering resources, too, should be sufficient for the D. *} text {* Main things to check: \begin{itemize} \item Relationship to high-level types and defunctionalisation-based compilation? \item Problems because of no distinction btw funame and varname? \item Examples for: rec h-o. functions, resources \item Type system for heap allocations \end{itemize} *} end