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