3807
|
1 |
(*
|
|
2 |
File: MemClerk.ML
|
|
3 |
Author: Stephan Merz
|
|
4 |
Copyright: 1997 University of Munich
|
|
5 |
|
6255
|
6 |
RPC-Memory example: Memory clerk specification (theorems and proofs)
|
3807
|
7 |
*)
|
|
8 |
|
|
9 |
val MC_action_defs =
|
6255
|
10 |
[MClkInit_def, MClkFwd_def, MClkRetry_def, MClkReply_def, MClkNext_def];
|
3807
|
11 |
|
|
12 |
val MC_temp_defs = [MClkIPSpec_def, MClkISpec_def];
|
|
13 |
|
6255
|
14 |
val mem_css = (claset(), simpset());
|
|
15 |
|
3807
|
16 |
(* The Clerk engages in an action for process p only if there is an outstanding,
|
|
17 |
unanswered call for that process.
|
|
18 |
*)
|
|
19 |
|
|
20 |
qed_goal "MClkidle" MemClerk.thy
|
6255
|
21 |
"|- ~$Calling send p & $(cst!p) = #clkA --> ~MClkNext send rcv cst p"
|
|
22 |
(fn _ => [ auto_tac (mem_css addsimps2 (Return_def::MC_action_defs)) ]);
|
3807
|
23 |
|
|
24 |
qed_goal "MClkbusy" MemClerk.thy
|
6255
|
25 |
"|- $Calling rcv p --> ~MClkNext send rcv cst p"
|
|
26 |
(fn _ => [ auto_tac (mem_css addsimps2 (MC_action_defs @ [Call_def])) ]);
|
3807
|
27 |
|
|
28 |
(* Enabledness of actions *)
|
|
29 |
|
|
30 |
qed_goal "MClkFwd_enabled" MemClerk.thy
|
6255
|
31 |
"!!p. basevars (rtrner send!p, caller rcv!p, cst!p) ==> \
|
|
32 |
\ |- Calling send p & ~Calling rcv p & cst!p = #clkA \
|
|
33 |
\ --> Enabled (MClkFwd send rcv cst p)"
|
4089
|
34 |
(fn _ => [action_simp_tac (simpset() addsimps [MClkFwd_def,Call_def,caller_def,rtrner_def])
|
7881
|
35 |
[exI] [base_enabled,Pair_inject] 1]);
|
3807
|
36 |
|
|
37 |
qed_goal "MClkFwd_ch_enabled" MemClerk.thy
|
6255
|
38 |
"|- Enabled (MClkFwd send rcv cst p) --> \
|
|
39 |
\ Enabled (<MClkFwd send rcv cst p>_(cst!p, rtrner send!p, caller rcv!p))"
|
|
40 |
(fn _ => [auto_tac (mem_css addSEs2 [enabled_mono]
|
|
41 |
addsimps2 [angle_def,MClkFwd_def])
|
|
42 |
]);
|
3807
|
43 |
|
|
44 |
qed_goal "MClkReply_change" MemClerk.thy
|
6255
|
45 |
"|- MClkReply send rcv cst p --> <MClkReply send rcv cst p>_(cst!p, rtrner send!p, caller rcv!p)"
|
|
46 |
(fn _ => [auto_tac (mem_css addsimps2 [angle_def,MClkReply_def]
|
|
47 |
addEs2 [Return_changed])
|
3807
|
48 |
]);
|
|
49 |
|
|
50 |
qed_goal "MClkReply_enabled" MemClerk.thy
|
6255
|
51 |
"!!p. basevars (rtrner send!p, caller rcv!p, cst!p) ==> \
|
|
52 |
\ |- Calling send p & ~Calling rcv p & cst!p = #clkB \
|
|
53 |
\ --> Enabled (<MClkReply send rcv cst p>_(cst!p, rtrner send!p, caller rcv!p))"
|
4089
|
54 |
(fn _ => [action_simp_tac (simpset()) [MClkReply_change RSN (2,enabled_mono)] [] 1,
|
|
55 |
action_simp_tac (simpset() addsimps [MClkReply_def,Return_def,caller_def,rtrner_def])
|
7881
|
56 |
[exI] [base_enabled,Pair_inject] 1
|
3807
|
57 |
]);
|
|
58 |
|
|
59 |
qed_goal "MClkReplyNotRetry" MemClerk.thy
|
6255
|
60 |
"|- MClkReply send rcv cst p --> ~MClkRetry send rcv cst p"
|
|
61 |
(fn _ => [ auto_tac (mem_css addsimps2 [MClkReply_def,MClkRetry_def]) ]);
|
|
62 |
|