| author | wenzelm | 
| Thu, 10 Aug 2000 00:45:23 +0200 | |
| changeset 9569 | 68400ff46b09 | 
| parent 9517 | f58863b1406a | 
| child 10231 | 178a272bceeb | 
| permissions | -rw-r--r-- | 
| 3807 | 1 | (* | 
| 2 | File: Memory.ML | |
| 3 | Author: Stephan Merz | |
| 4 | Copyright: 1997 University of Munich | |
| 5 | ||
| 6255 | 6 | RPC-Memory example: Memory specification (theorems and proofs) | 
| 3807 | 7 | *) | 
| 8 | ||
| 9 | val RM_action_defs = | |
| 6255 | 10 | [MInit_def, PInit_def, RdRequest_def, WrRequest_def, MemInv_def, | 
| 11 | GoodRead_def, BadRead_def, ReadInner_def, Read_def, | |
| 12 | GoodWrite_def, BadWrite_def, WriteInner_def, Write_def, | |
| 13 | MemReturn_def, RNext_def]; | |
| 3807 | 14 | |
| 15 | val UM_action_defs = RM_action_defs @ [MemFail_def, UNext_def]; | |
| 16 | ||
| 17 | val RM_temp_defs = [RPSpec_def, MSpec_def, IRSpec_def]; | |
| 18 | val UM_temp_defs = [UPSpec_def, MSpec_def, IUSpec_def]; | |
| 19 | ||
| 6255 | 20 | val mem_css = (claset(), simpset()); | 
| 3807 | 21 | |
| 4828 | 22 | (* -------------------- Proofs ---------------------------------------------- *) | 
| 3807 | 23 | |
| 24 | (* The reliable memory is an implementation of the unreliable one *) | |
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 25 | Goal "|- IRSpec ch mm rs --> IUSpec ch mm rs"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 26 | by (force_tac (temp_css addsimps2 ([UNext_def,UPSpec_def,IUSpec_def] @ RM_temp_defs) | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 27 | addSEs2 [STL4E,squareE]) 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 28 | qed "ReliableImplementsUnReliable"; | 
| 3807 | 29 | |
| 30 | (* The memory spec implies the memory invariant *) | |
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 31 | Goal "|- MSpec ch mm rs l --> [](MemInv mm l)"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 32 | by (auto_inv_tac (simpset() addsimps RM_temp_defs @ RM_action_defs) 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 33 | qed "MemoryInvariant"; | 
| 3807 | 34 | |
| 35 | (* The invariant is trivial for non-locations *) | |
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 36 | Goal "|- #l ~: #MemLoc --> [](MemInv mm l)"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 37 | by (auto_tac (temp_css addsimps2 [MemInv_def] addSIs2 [necT])); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 38 | qed "NonMemLocInvariant"; | 
| 3807 | 39 | |
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 40 | Goal "|- (ALL l. #l : #MemLoc --> MSpec ch mm rs l) --> (ALL l. [](MemInv mm l))"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 41 | by (step_tac temp_cs 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 42 | by (case_tac "l : MemLoc" 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 43 | by (auto_tac (temp_css addSEs2 [MemoryInvariant,NonMemLocInvariant])); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 44 | qed "MemoryInvariantAll"; | 
| 3807 | 45 | |
| 4828 | 46 | (* The memory engages in an action for process p only if there is an | 
| 47 | unanswered call from p. | |
| 3807 | 48 | We need this only for the reliable memory. | 
| 49 | *) | |
| 50 | ||
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 51 | Goal "|- ~$(Calling ch p) --> ~ RNext ch mm rs p"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 52 | by (auto_tac (mem_css addsimps2 (Return_def::RM_action_defs))); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 53 | qed "Memoryidle"; | 
| 3807 | 54 | |
| 55 | (* Enabledness conditions *) | |
| 56 | ||
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 57 | Goal "|- MemReturn ch rs p --> <MemReturn ch rs p>_(rtrner ch ! p, rs!p)"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 58 | by (force_tac (mem_css addsimps2 [MemReturn_def,angle_def]) 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 59 | qed "MemReturn_change"; | 
| 3807 | 60 | |
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 61 | Goal "!!p. basevars (rtrner ch ! p, rs!p) ==> \ | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 62 | \ |- Calling ch p & (rs!p ~= #NotAResult) \ | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 63 | \ --> Enabled (<MemReturn ch rs p>_(rtrner ch ! p, rs!p))"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 64 | by (action_simp_tac (simpset()) [MemReturn_change RSN (2,enabled_mono)] [] 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 65 | by (action_simp_tac (simpset() addsimps [MemReturn_def,Return_def,rtrner_def]) | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 66 | [exI] [base_enabled,Pair_inject] 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 67 | qed "MemReturn_enabled"; | 
| 3807 | 68 | |
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 69 | Goal "!!p. basevars (rtrner ch ! p, rs!p) ==> \ | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 70 | \ |- Calling ch p & (arg<ch!p> = #(read l)) --> Enabled (ReadInner ch mm rs p l)"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 71 | by (case_tac "l : MemLoc" 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 72 | by (ALLGOALS | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 73 | (force_tac (mem_css addsimps2 [ReadInner_def,GoodRead_def, | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 74 | BadRead_def,RdRequest_def] | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 75 | addSIs2 [exI] addSEs2 [base_enabled]))); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 76 | qed "ReadInner_enabled"; | 
| 3807 | 77 | |
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 78 | Goal "!!p. basevars (mm!l, rtrner ch ! p, rs!p) ==> \ | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 79 | \ |- Calling ch p & (arg<ch!p> = #(write l v)) \ | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 80 | \ --> Enabled (WriteInner ch mm rs p l v)"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 81 | by (case_tac "l:MemLoc & v:MemVal" 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 82 | by (ALLGOALS | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 83 | (force_tac (mem_css addsimps2 [WriteInner_def,GoodWrite_def, | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 84 | BadWrite_def,WrRequest_def] | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 85 | addSIs2 [exI] addSEs2 [base_enabled]))); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 86 | qed "WriteInner_enabled"; | 
| 3807 | 87 | |
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 88 | Goal "|- Read ch mm rs p & (!l. $(MemInv mm l)) --> (rs!p)` ~= #NotAResult"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 89 | by (force_tac (mem_css addsimps2 | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 90 | [Read_def,ReadInner_def,GoodRead_def,BadRead_def,MemInv_def]) 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 91 | qed "ReadResult"; | 
| 3807 | 92 | |
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 93 | Goal "|- Write ch mm rs p l --> (rs!p)` ~= #NotAResult"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 94 | by (auto_tac (mem_css addsimps2 ([Write_def,WriteInner_def,GoodWrite_def,BadWrite_def]))); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 95 | qed "WriteResult"; | 
| 3807 | 96 | |
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 97 | Goal "|- (ALL l. $MemInv mm l) & MemReturn ch rs p \ | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 98 | \ --> ~ Read ch mm rs p & (ALL l. ~ Write ch mm rs p l)"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 99 | by (auto_tac (mem_css addsimps2 [MemReturn_def] addSDs2 [WriteResult, ReadResult])); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 100 | qed "ReturnNotReadWrite"; | 
| 3807 | 101 | |
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 102 | Goal "|- (rs!p = #NotAResult) & (!l. MemInv mm l) \ | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 103 | \ & Enabled (Read ch mm rs p | (? l. Write ch mm rs p l)) \ | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 104 | \ --> Enabled (<RNext ch mm rs p>_(rtrner ch ! p, rs!p))"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 105 | by (force_tac (mem_css addsimps2 [RNext_def,angle_def] | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 106 | addSEs2 [enabled_mono2] | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 107 | addDs2 [ReadResult, WriteResult]) 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 108 | qed "RWRNext_enabled"; | 
| 3807 | 109 | |
| 110 | ||
| 111 | (* Combine previous lemmas: the memory can make a visible step if there is an | |
| 112 | outstanding call for which no result has been produced. | |
| 113 | *) | |
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 114 | Goal "!!p. !l. basevars (mm!l, rtrner ch!p, rs!p) ==> \ | 
| 6255 | 115 | \ |- (rs!p = #NotAResult) & Calling ch p & (!l. MemInv mm l) \ | 
| 9517 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 116 | \ --> Enabled (<RNext ch mm rs p>_(rtrner ch ! p, rs!p))"; | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 117 | by (auto_tac (mem_css addsimps2 [enabled_disj] addSIs2 [RWRNext_enabled])); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 118 | by (case_tac "arg(ch w p)" 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 119 | by (action_simp_tac (simpset()addsimps[Read_def,enabled_ex]) | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 120 | [ReadInner_enabled,exI] [] 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 121 | by (force_tac (mem_css addDs2 [base_pair]) 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 122 | by (etac swap 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 123 | by (action_simp_tac (simpset() addsimps [Write_def,enabled_ex]) | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 124 | [WriteInner_enabled,exI] [] 1); | 
| 
f58863b1406a
tuned version by Stephan Merz (unbatchified etc.);
 wenzelm parents: 
8442diff
changeset | 125 | qed "RNext_enabled"; |