src/HOL/Hoare/Hoare.thy
changeset 13764 3e180bf68496
parent 13737 e564c3d2d174
child 13857 11d7c5a8dbb7
equal deleted inserted replaced
13763:f94b569cd610 13764:3e180bf68496
    46 
    46 
    47 constdefs Valid :: "'a bexp \<Rightarrow> 'a com \<Rightarrow> 'a bexp \<Rightarrow> bool"
    47 constdefs Valid :: "'a bexp \<Rightarrow> 'a com \<Rightarrow> 'a bexp \<Rightarrow> bool"
    48   "Valid p c q == !s s'. Sem c s s' --> s : p --> s' : q"
    48   "Valid p c q == !s s'. Sem c s s' --> s : p --> s' : q"
    49 
    49 
    50 
    50 
    51 nonterminals
       
    52   vars
       
    53 
       
    54 syntax
    51 syntax
    55   ""		     :: "id => vars"		       ("_")
    52  "@hoare_vars" :: "[idts, 'a assn,'a com,'a assn] => bool"
    56   "_vars" 	     :: "[id, vars] => vars"	       ("_ _")
       
    57 
       
    58 syntax
       
    59  "@hoare_vars" :: "[vars, 'a assn,'a com,'a assn] => bool"
       
    60                  ("VARS _// {_} // _ // {_}" [0,0,55,0] 50)
    53                  ("VARS _// {_} // _ // {_}" [0,0,55,0] 50)
    61 syntax ("" output)
    54 syntax ("" output)
    62  "@hoare"      :: "['a assn,'a com,'a assn] => bool"
    55  "@hoare"      :: "['a assn,'a com,'a assn] => bool"
    63                  ("{_} // _ // {_}" [0,55,0] 50)
    56                  ("{_} // _ // {_}" [0,55,0] 50)
    64 
    57 
    65 (** parse translations **)
    58 (** parse translations **)
    66 
    59 
    67 ML{*
    60 ML{*
    68 fun mk_abstuple []     body = absfree ("x", dummyT, body)
    61 
    69   | mk_abstuple [v]    body = absfree ((fst o dest_Free) v, dummyT, body)
    62 local
    70   | mk_abstuple (v::w) body = Syntax.const "split" $
    63 fun free a = Free(a,dummyT)
    71                               absfree ((fst o dest_Free) v, dummyT, mk_abstuple w body);
    64 fun abs((a,T),body) =
    72 
    65   let val a = absfree(a, dummyT, body)
    73   
    66   in if T = Bound 0 then a else Const(Syntax.constrainAbsC,dummyT) $ a $ T end
    74 fun mk_fbody v e []      = Syntax.const "Unity"
    67 in
    75   | mk_fbody v e [x]     = if v=x then e else x
    68 
    76   | mk_fbody v e (x::xs) = Syntax.const "Pair" $ (if v=x then e else x) $
    69 fun mk_abstuple [x] body = abs (x, body)
    77                            mk_fbody v e xs;
    70   | mk_abstuple (x::xs) body =
    78 
    71       Syntax.const "split" $ abs (x, mk_abstuple xs body);
    79 fun mk_fexp v e xs = mk_abstuple xs (mk_fbody v e xs);
    72 
       
    73 fun mk_fbody a e [x as (b,_)] = if a=b then e else free b
       
    74   | mk_fbody a e ((b,_)::xs) =
       
    75       Syntax.const "Pair" $ (if a=b then e else free b) $ mk_fbody a e xs;
       
    76 
       
    77 fun mk_fexp a e xs = mk_abstuple xs (mk_fbody a e xs)
       
    78 end
    80 *}
    79 *}
    81 
    80 
    82 (* bexp_tr & assn_tr *)
    81 (* bexp_tr & assn_tr *)
    83 (*all meta-variables for bexp except for TRUE are translated as if they
    82 (*all meta-variables for bexp except for TRUE are translated as if they
    84   were boolean expressions*)
    83   were boolean expressions*)
    86 fun bexp_tr (Const ("TRUE", _)) xs = Syntax.const "TRUE"
    85 fun bexp_tr (Const ("TRUE", _)) xs = Syntax.const "TRUE"
    87   | bexp_tr b xs = Syntax.const "Collect" $ mk_abstuple xs b;
    86   | bexp_tr b xs = Syntax.const "Collect" $ mk_abstuple xs b;
    88   
    87   
    89 fun assn_tr r xs = Syntax.const "Collect" $ mk_abstuple xs r;
    88 fun assn_tr r xs = Syntax.const "Collect" $ mk_abstuple xs r;
    90 *}
    89 *}
    91 
       
    92 (* com_tr *)
    90 (* com_tr *)
    93 ML{*
    91 ML{*
    94 fun assign_tr [Free (V,_),E] xs = Syntax.const "Basic" $
    92 fun com_tr (Const("@assign",_) $ Free (a,_) $ e) xs =
    95                                       mk_fexp (Free(V,dummyT)) E xs
    93       Syntax.const "Basic" $ mk_fexp a e xs
    96   | assign_tr ts _ = raise TERM ("assign_tr", ts);
       
    97 
       
    98 fun com_tr (Const("@assign",_) $ Free (V,_) $ E) xs =
       
    99                assign_tr [Free (V,dummyT),E] xs
       
   100   | com_tr (Const ("Basic",_) $ f) xs = Syntax.const "Basic" $ f
    94   | com_tr (Const ("Basic",_) $ f) xs = Syntax.const "Basic" $ f
   101   | com_tr (Const ("Seq",_) $ c1 $ c2) xs = Syntax.const "Seq" $
    95   | com_tr (Const ("Seq",_) $ c1 $ c2) xs =
   102                                                  com_tr c1 xs $ com_tr c2 xs
    96       Syntax.const "Seq" $ com_tr c1 xs $ com_tr c2 xs
   103   | com_tr (Const ("Cond",_) $ b $ c1 $ c2) xs = Syntax.const "Cond" $
    97   | com_tr (Const ("Cond",_) $ b $ c1 $ c2) xs =
   104                                   bexp_tr b xs $ com_tr c1 xs $ com_tr c2 xs
    98       Syntax.const "Cond" $ bexp_tr b xs $ com_tr c1 xs $ com_tr c2 xs
   105   | com_tr (Const ("While",_) $ b $ I $ c) xs = Syntax.const "While" $
    99   | com_tr (Const ("While",_) $ b $ I $ c) xs =
   106                                          bexp_tr b xs $ assn_tr I xs $ com_tr c xs
   100       Syntax.const "While" $ bexp_tr b xs $ assn_tr I xs $ com_tr c xs
   107   | com_tr trm _ = trm;
   101   | com_tr t _ = t (* if t is just a Free/Var *)
   108 *}
   102 *}
   109 
   103 
   110 (* triple_tr *)
   104 (* triple_tr *)
   111 ML{*
   105 ML{*
   112 fun vars_tr (x as Free _) = [x]
   106 local
   113   | vars_tr (Const ("_vars", _) $ (x as Free _) $ vars) = x :: vars_tr vars
   107 
   114   | vars_tr t = raise TERM ("vars_tr", [t]);
   108 fun var_tr(Free(a,_)) = (a,Bound 0) (* Bound 0 = dummy term *)
   115 
   109   | var_tr(Const ("_constrain", _) $ (Free (a,_)) $ T) = (a,T);
       
   110 
       
   111 fun vars_tr (Const ("_idts", _) $ idt $ vars) = var_tr idt :: vars_tr vars
       
   112   | vars_tr t = [var_tr t]
       
   113 
       
   114 in
   116 fun hoare_vars_tr [vars, pre, prg, post] =
   115 fun hoare_vars_tr [vars, pre, prg, post] =
   117       let val xs = vars_tr vars
   116       let val xs = vars_tr vars
   118       in Syntax.const "Valid" $
   117       in Syntax.const "Valid" $
   119            assn_tr pre xs $ com_tr prg xs $ assn_tr post xs
   118          assn_tr pre xs $ com_tr prg xs $ assn_tr post xs
   120       end
   119       end
   121   | hoare_vars_tr ts = raise TERM ("hoare_vars_tr", ts);
   120   | hoare_vars_tr ts = raise TERM ("hoare_vars_tr", ts);
       
   121 end
   122 *}
   122 *}
   123 
   123 
   124 parse_translation {* [("@hoare_vars", hoare_vars_tr)] *}
   124 parse_translation {* [("@hoare_vars", hoare_vars_tr)] *}
   125 
   125 
   126 
   126