3807
|
1 |
(*
|
|
2 |
File: MemClerk.thy
|
|
3 |
Author: Stephan Merz
|
|
4 |
Copyright: 1997 University of Munich
|
|
5 |
|
|
6 |
Theory Name: MemClerk
|
|
7 |
Logic Image: TLA
|
|
8 |
|
|
9 |
RPC-Memory example: specification of the memory clerk.
|
|
10 |
*)
|
|
11 |
|
|
12 |
MemClerk = Memory + RPC + MemClerkParameters +
|
|
13 |
|
|
14 |
types
|
|
15 |
(* The clerk takes the same arguments as the memory and sends requests to the RPC *)
|
|
16 |
mClkSndChType = "memChType"
|
|
17 |
mClkRcvChType = "rpcSndChType"
|
|
18 |
mClkStType = "(PrIds => mClkState) stfun"
|
|
19 |
|
|
20 |
consts
|
|
21 |
(* state predicates *)
|
|
22 |
MClkInit :: "mClkRcvChType => mClkStType => PrIds => stpred"
|
|
23 |
|
|
24 |
(* actions *)
|
|
25 |
MClkFwd :: "mClkSndChType => mClkRcvChType => mClkStType => PrIds => action"
|
|
26 |
MClkRetry :: "mClkSndChType => mClkRcvChType => mClkStType => PrIds => action"
|
|
27 |
MClkReply :: "mClkSndChType => mClkRcvChType => mClkStType => PrIds => action"
|
|
28 |
MClkNext :: "mClkSndChType => mClkRcvChType => mClkStType => PrIds => action"
|
|
29 |
|
|
30 |
(* temporal *)
|
|
31 |
MClkIPSpec :: "mClkSndChType => mClkRcvChType => mClkStType => PrIds => temporal"
|
|
32 |
MClkISpec :: "mClkSndChType => mClkRcvChType => mClkStType => temporal"
|
|
33 |
|
|
34 |
rules
|
|
35 |
MClkInit_def "$(MClkInit rcv cst p) .=
|
|
36 |
($(cst@p) .= #clkA .& .~ $(Calling rcv p))"
|
|
37 |
|
|
38 |
MClkFwd_def "MClkFwd send rcv cst p ==
|
|
39 |
$(Calling send p)
|
|
40 |
.& $(cst@p) .= #clkA
|
|
41 |
.& Call rcv p (MClkRelayArg[ arg[$(send@p)] ])
|
|
42 |
.& (cst@p)$ .= #clkB
|
|
43 |
.& unchanged (rtrner send @ p)"
|
|
44 |
|
|
45 |
MClkRetry_def "MClkRetry send rcv cst p ==
|
|
46 |
$(cst@p) .= #clkB
|
|
47 |
.& res[$(rcv@p)] .= #RPCFailure
|
|
48 |
.& Call rcv p (MClkRelayArg[ arg[$(send@p)] ])
|
|
49 |
.& unchanged <cst@p, rtrner send @ p>"
|
|
50 |
|
|
51 |
MClkReply_def "MClkReply send rcv cst p ==
|
|
52 |
.~ $(Calling rcv p)
|
|
53 |
.& $(cst@p) .= #clkB
|
|
54 |
.& Return send p (MClkReplyVal[ res[$(rcv@p)] ])
|
|
55 |
.& (cst@p)$ .= #clkA
|
|
56 |
.& unchanged (caller rcv @ p)"
|
|
57 |
|
|
58 |
MClkNext_def "MClkNext send rcv cst p ==
|
|
59 |
MClkFwd send rcv cst p
|
|
60 |
.| MClkRetry send rcv cst p
|
|
61 |
.| MClkReply send rcv cst p"
|
|
62 |
|
|
63 |
MClkIPSpec_def "MClkIPSpec send rcv cst p ==
|
|
64 |
Init($(MClkInit rcv cst p))
|
|
65 |
.& [][ MClkNext send rcv cst p ]_<cst@p, rtrner send @ p, caller rcv @ p>
|
|
66 |
.& WF(MClkFwd send rcv cst p)_<cst@p, rtrner send @ p, caller rcv @ p>
|
|
67 |
.& SF(MClkReply send rcv cst p)_<cst@p, rtrner send @ p, caller rcv @ p>"
|
|
68 |
|
|
69 |
MClkISpec_def "MClkISpec send rcv cst == RALL p. MClkIPSpec send rcv cst p"
|
|
70 |
end
|
|
71 |
|
|
72 |
|