48 |
51 |
49 RSpec :: "memChType => resType => temporal" |
52 RSpec :: "memChType => resType => temporal" |
50 USpec :: "memChType => temporal" |
53 USpec :: "memChType => temporal" |
51 |
54 |
52 (* memory invariant: in the paper, the invariant is hidden in the definition of |
55 (* memory invariant: in the paper, the invariant is hidden in the definition of |
53 the predicate S used in the implementation proof, but it is easier to verify |
56 the predicate S used in the implementation proof, but it is easier to verify |
54 at this level. *) |
57 at this level. *) |
55 MemInv :: "memType => Locs => stpred" |
58 MemInv :: "memType => Locs => stpred" |
56 |
59 |
57 rules |
60 defs |
58 MInit_def "MInit mm l == PRED mm!l = #InitVal" |
61 MInit_def: "MInit mm l == PRED mm!l = #InitVal" |
59 PInit_def "PInit rs p == PRED rs!p = #NotAResult" |
62 PInit_def: "PInit rs p == PRED rs!p = #NotAResult" |
60 |
63 |
61 RdRequest_def "RdRequest ch p l == PRED |
64 RdRequest_def: "RdRequest ch p l == PRED |
62 Calling ch p & (arg<ch!p> = #(read l))" |
65 Calling ch p & (arg<ch!p> = #(read l))" |
63 WrRequest_def "WrRequest ch p l v == PRED |
66 WrRequest_def: "WrRequest ch p l v == PRED |
64 Calling ch p & (arg<ch!p> = #(write l v))" |
67 Calling ch p & (arg<ch!p> = #(write l v))" |
65 (* a read that doesn't raise BadArg *) |
68 (* a read that doesn't raise BadArg *) |
66 GoodRead_def "GoodRead mm rs p l == ACT |
69 GoodRead_def: "GoodRead mm rs p l == ACT |
67 #l : #MemLoc & ((rs!p)$ = $(mm!l))" |
70 #l : #MemLoc & ((rs!p)$ = $(mm!l))" |
68 (* a read that raises BadArg *) |
71 (* a read that raises BadArg *) |
69 BadRead_def "BadRead mm rs p l == ACT |
72 BadRead_def: "BadRead mm rs p l == ACT |
70 #l ~: #MemLoc & ((rs!p)$ = #BadArg)" |
73 #l ~: #MemLoc & ((rs!p)$ = #BadArg)" |
71 (* the read action with l visible *) |
74 (* the read action with l visible *) |
72 ReadInner_def "ReadInner ch mm rs p l == ACT |
75 ReadInner_def: "ReadInner ch mm rs p l == ACT |
73 $(RdRequest ch p l) |
76 $(RdRequest ch p l) |
74 & (GoodRead mm rs p l | BadRead mm rs p l) |
77 & (GoodRead mm rs p l | BadRead mm rs p l) |
75 & unchanged (rtrner ch ! p)" |
78 & unchanged (rtrner ch ! p)" |
76 (* the read action with l quantified *) |
79 (* the read action with l quantified *) |
77 Read_def "Read ch mm rs p == ACT (EX l. ReadInner ch mm rs p l)" |
80 Read_def: "Read ch mm rs p == ACT (EX l. ReadInner ch mm rs p l)" |
78 |
81 |
79 (* similar definitions for the write action *) |
82 (* similar definitions for the write action *) |
80 GoodWrite_def "GoodWrite mm rs p l v == ACT |
83 GoodWrite_def: "GoodWrite mm rs p l v == ACT |
81 #l : #MemLoc & #v : #MemVal |
84 #l : #MemLoc & #v : #MemVal |
82 & ((mm!l)$ = #v) & ((rs!p)$ = #OK)" |
85 & ((mm!l)$ = #v) & ((rs!p)$ = #OK)" |
83 BadWrite_def "BadWrite mm rs p l v == ACT |
86 BadWrite_def: "BadWrite mm rs p l v == ACT |
84 ~ (#l : #MemLoc & #v : #MemVal) |
87 ~ (#l : #MemLoc & #v : #MemVal) |
85 & ((rs!p)$ = #BadArg) & unchanged (mm!l)" |
88 & ((rs!p)$ = #BadArg) & unchanged (mm!l)" |
86 WriteInner_def "WriteInner ch mm rs p l v == ACT |
89 WriteInner_def: "WriteInner ch mm rs p l v == ACT |
87 $(WrRequest ch p l v) |
90 $(WrRequest ch p l v) |
88 & (GoodWrite mm rs p l v | BadWrite mm rs p l v) |
91 & (GoodWrite mm rs p l v | BadWrite mm rs p l v) |
89 & unchanged (rtrner ch ! p)" |
92 & unchanged (rtrner ch ! p)" |
90 Write_def "Write ch mm rs p l == ACT (EX v. WriteInner ch mm rs p l v)" |
93 Write_def: "Write ch mm rs p l == ACT (EX v. WriteInner ch mm rs p l v)" |
91 |
94 |
92 (* the return action *) |
95 (* the return action *) |
93 MemReturn_def "MemReturn ch rs p == ACT |
96 MemReturn_def: "MemReturn ch rs p == ACT |
94 ( ($(rs!p) ~= #NotAResult) |
97 ( ($(rs!p) ~= #NotAResult) |
95 & ((rs!p)$ = #NotAResult) |
98 & ((rs!p)$ = #NotAResult) |
96 & Return ch p (rs!p))" |
99 & Return ch p (rs!p))" |
97 |
100 |
98 (* the failure action of the unreliable memory *) |
101 (* the failure action of the unreliable memory *) |
99 MemFail_def "MemFail ch rs p == ACT |
102 MemFail_def: "MemFail ch rs p == ACT |
100 $(Calling ch p) |
103 $(Calling ch p) |
101 & ((rs!p)$ = #MemFailure) |
104 & ((rs!p)$ = #MemFailure) |
102 & unchanged (rtrner ch ! p)" |
105 & unchanged (rtrner ch ! p)" |
103 (* next-state relations for reliable / unreliable memory *) |
106 (* next-state relations for reliable / unreliable memory *) |
104 RNext_def "RNext ch mm rs p == ACT |
107 RNext_def: "RNext ch mm rs p == ACT |
105 ( Read ch mm rs p |
108 ( Read ch mm rs p |
106 | (EX l. Write ch mm rs p l) |
109 | (EX l. Write ch mm rs p l) |
107 | MemReturn ch rs p)" |
110 | MemReturn ch rs p)" |
108 UNext_def "UNext ch mm rs p == ACT |
111 UNext_def: "UNext ch mm rs p == ACT |
109 (RNext ch mm rs p | MemFail ch rs p)" |
112 (RNext ch mm rs p | MemFail ch rs p)" |
110 |
113 |
111 RPSpec_def "RPSpec ch mm rs p == TEMP |
114 RPSpec_def: "RPSpec ch mm rs p == TEMP |
112 Init(PInit rs p) |
115 Init(PInit rs p) |
113 & [][ RNext ch mm rs p ]_(rtrner ch ! p, rs!p) |
116 & [][ RNext ch mm rs p ]_(rtrner ch ! p, rs!p) |
114 & WF(RNext ch mm rs p)_(rtrner ch ! p, rs!p) |
117 & WF(RNext ch mm rs p)_(rtrner ch ! p, rs!p) |
115 & WF(MemReturn ch rs p)_(rtrner ch ! p, rs!p)" |
118 & WF(MemReturn ch rs p)_(rtrner ch ! p, rs!p)" |
116 UPSpec_def "UPSpec ch mm rs p == TEMP |
119 UPSpec_def: "UPSpec ch mm rs p == TEMP |
117 Init(PInit rs p) |
120 Init(PInit rs p) |
118 & [][ UNext ch mm rs p ]_(rtrner ch ! p, rs!p) |
121 & [][ UNext ch mm rs p ]_(rtrner ch ! p, rs!p) |
119 & WF(RNext ch mm rs p)_(rtrner ch ! p, rs!p) |
122 & WF(RNext ch mm rs p)_(rtrner ch ! p, rs!p) |
120 & WF(MemReturn ch rs p)_(rtrner ch ! p, rs!p)" |
123 & WF(MemReturn ch rs p)_(rtrner ch ! p, rs!p)" |
121 MSpec_def "MSpec ch mm rs l == TEMP |
124 MSpec_def: "MSpec ch mm rs l == TEMP |
122 Init(MInit mm l) |
125 Init(MInit mm l) |
123 & [][ EX p. Write ch mm rs p l ]_(mm!l)" |
126 & [][ EX p. Write ch mm rs p l ]_(mm!l)" |
124 IRSpec_def "IRSpec ch mm rs == TEMP |
127 IRSpec_def: "IRSpec ch mm rs == TEMP |
125 (ALL p. RPSpec ch mm rs p) |
128 (ALL p. RPSpec ch mm rs p) |
126 & (ALL l. #l : #MemLoc --> MSpec ch mm rs l)" |
129 & (ALL l. #l : #MemLoc --> MSpec ch mm rs l)" |
127 IUSpec_def "IUSpec ch mm rs == TEMP |
130 IUSpec_def: "IUSpec ch mm rs == TEMP |
128 (ALL p. UPSpec ch mm rs p) |
131 (ALL p. UPSpec ch mm rs p) |
129 & (ALL l. #l : #MemLoc --> MSpec ch mm rs l)" |
132 & (ALL l. #l : #MemLoc --> MSpec ch mm rs l)" |
130 |
133 |
131 RSpec_def "RSpec ch rs == TEMP (EEX mm. IRSpec ch mm rs)" |
134 RSpec_def: "RSpec ch rs == TEMP (EEX mm. IRSpec ch mm rs)" |
132 USpec_def "USpec ch == TEMP (EEX mm rs. IUSpec ch mm rs)" |
135 USpec_def: "USpec ch == TEMP (EEX mm rs. IUSpec ch mm rs)" |
133 |
136 |
134 MemInv_def "MemInv mm l == PRED #l : #MemLoc --> mm!l : #MemVal" |
137 MemInv_def: "MemInv mm l == PRED #l : #MemLoc --> mm!l : #MemVal" |
|
138 |
|
139 ML {* use_legacy_bindings (the_context ()) *} |
|
140 |
135 end |
141 end |