| 
41589
 | 
     1  | 
(*  Title:      HOL/TLA/Buffer/Buffer.thy
  | 
| 
 | 
     2  | 
    Author:     Stephan Merz, University of Munich
  | 
| 
3807
 | 
     3  | 
*)
  | 
| 
 | 
     4  | 
  | 
| 
17309
 | 
     5  | 
header {* A simple FIFO buffer (synchronous communication, interleaving) *}
 | 
| 
 | 
     6  | 
  | 
| 
 | 
     7  | 
theory Buffer
  | 
| 
 | 
     8  | 
imports TLA
  | 
| 
 | 
     9  | 
begin
  | 
| 
3807
 | 
    10  | 
  | 
| 
 | 
    11  | 
consts
  | 
| 
 | 
    12  | 
  (* actions *)
  | 
| 
6255
 | 
    13  | 
  BInit     :: "'a stfun => 'a list stfun => 'a stfun => stpred"
  | 
| 
3807
 | 
    14  | 
  Enq       :: "'a stfun => 'a list stfun => 'a stfun => action"
  | 
| 
 | 
    15  | 
  Deq       :: "'a stfun => 'a list stfun => 'a stfun => action"
  | 
| 
 | 
    16  | 
  Next      :: "'a stfun => 'a list stfun => 'a stfun => action"
  | 
| 
 | 
    17  | 
  | 
| 
 | 
    18  | 
  (* temporal formulas *)
  | 
| 
 | 
    19  | 
  IBuffer   :: "'a stfun => 'a list stfun => 'a stfun => temporal"
  | 
| 
 | 
    20  | 
  Buffer    :: "'a stfun => 'a stfun => temporal"
  | 
| 
 | 
    21  | 
  | 
| 
17309
 | 
    22  | 
defs
  | 
| 
 | 
    23  | 
  BInit_def:   "BInit ic q oc    == PRED q = #[]"
  | 
| 
 | 
    24  | 
  Enq_def:     "Enq ic q oc      == ACT (ic$ ~= $ic)
  | 
| 
 | 
    25  | 
                                     & (q$ = $q @ [ ic$ ])
  | 
| 
6255
 | 
    26  | 
                                     & (oc$ = $oc)"
  | 
| 
17309
 | 
    27  | 
  Deq_def:     "Deq ic q oc      == ACT ($q ~= #[])
  | 
| 
6255
 | 
    28  | 
                                     & (oc$ = hd< $q >)
  | 
| 
 | 
    29  | 
                                     & (q$ = tl< $q >)
  | 
| 
 | 
    30  | 
                                     & (ic$ = $ic)"
  | 
| 
17309
 | 
    31  | 
  Next_def:    "Next ic q oc     == ACT (Enq ic q oc | Deq ic q oc)"
  | 
| 
 | 
    32  | 
  IBuffer_def: "IBuffer ic q oc  == TEMP Init (BInit ic q oc)
  | 
| 
6255
 | 
    33  | 
                                      & [][Next ic q oc]_(ic,q,oc)
  | 
| 
 | 
    34  | 
                                      & WF(Deq ic q oc)_(ic,q,oc)"
  | 
| 
17309
 | 
    35  | 
  Buffer_def:  "Buffer ic oc     == TEMP (EEX q. IBuffer ic q oc)"
  | 
| 
3807
 | 
    36  | 
  | 
| 
21624
 | 
    37  | 
  | 
| 
 | 
    38  | 
(* ---------------------------- Data lemmas ---------------------------- *)
  | 
| 
 | 
    39  | 
  | 
| 
 | 
    40  | 
(*FIXME: move to theory List? Maybe as (tl xs = xs) = (xs = [])"?*)
  | 
| 
 | 
    41  | 
lemma tl_not_self [simp]: "xs ~= [] ==> tl xs ~= xs"
  | 
| 
 | 
    42  | 
  by (auto simp: neq_Nil_conv)
  | 
| 
 | 
    43  | 
  | 
| 
 | 
    44  | 
  | 
| 
 | 
    45  | 
(* ---------------------------- Action lemmas ---------------------------- *)
  | 
| 
 | 
    46  | 
  | 
| 
 | 
    47  | 
(* Dequeue is visible *)
  | 
| 
 | 
    48  | 
lemma Deq_visible: "|- <Deq ic q oc>_(ic,q,oc) = Deq ic q oc"
  | 
| 
 | 
    49  | 
  apply (unfold angle_def Deq_def)
  | 
| 
 | 
    50  | 
  apply (safe, simp (asm_lr))+
  | 
| 
 | 
    51  | 
  done
  | 
| 
 | 
    52  | 
  | 
| 
 | 
    53  | 
(* Enabling condition for dequeue -- NOT NEEDED *)
  | 
| 
 | 
    54  | 
lemma Deq_enabled: 
  | 
| 
 | 
    55  | 
    "!!q. basevars (ic,q,oc) ==> |- Enabled (<Deq ic q oc>_(ic,q,oc)) = (q ~= #[])"
  | 
| 
 | 
    56  | 
  apply (unfold Deq_visible [temp_rewrite])
  | 
| 
 | 
    57  | 
  apply (force elim!: base_enabled [temp_use] enabledE [temp_use] simp: Deq_def)
  | 
| 
 | 
    58  | 
  done
  | 
| 
 | 
    59  | 
  | 
| 
 | 
    60  | 
(* For the left-to-right implication, we don't need the base variable stuff *)
  | 
| 
 | 
    61  | 
lemma Deq_enabledE: 
  | 
| 
 | 
    62  | 
    "|- Enabled (<Deq ic q oc>_(ic,q,oc)) --> (q ~= #[])"
  | 
| 
 | 
    63  | 
  apply (unfold Deq_visible [temp_rewrite])
  | 
| 
 | 
    64  | 
  apply (auto elim!: enabledE simp add: Deq_def)
  | 
| 
 | 
    65  | 
  done
  | 
| 
3807
 | 
    66  | 
  | 
| 
17309
 | 
    67  | 
end
  |