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 |