3807
|
1 |
(*
|
|
2 |
File: DBuffer.thy
|
17309
|
3 |
ID: $Id$
|
3807
|
4 |
Author: Stephan Merz
|
|
5 |
Copyright: 1997 University of Munich
|
|
6 |
|
|
7 |
Theory Name: DBuffer
|
|
8 |
Logic Image: TLA
|
|
9 |
*)
|
|
10 |
|
17309
|
11 |
header {* Two FIFO buffers in a row, with interleaving assumption *}
|
|
12 |
|
|
13 |
theory DBuffer
|
|
14 |
imports Buffer
|
|
15 |
begin
|
3807
|
16 |
|
|
17 |
consts
|
|
18 |
(* implementation variables *)
|
17309
|
19 |
inp :: "nat stfun"
|
|
20 |
mid :: "nat stfun"
|
|
21 |
out :: "nat stfun"
|
|
22 |
q1 :: "nat list stfun"
|
|
23 |
q2 :: "nat list stfun"
|
|
24 |
qc :: "nat list stfun"
|
3807
|
25 |
|
17309
|
26 |
DBInit :: stpred
|
|
27 |
DBEnq :: action
|
|
28 |
DBDeq :: action
|
|
29 |
DBPass :: action
|
|
30 |
DBNext :: action
|
|
31 |
DBuffer :: temporal
|
3807
|
32 |
|
17309
|
33 |
axioms
|
|
34 |
DB_base: "basevars (inp,mid,out,q1,q2)"
|
3807
|
35 |
|
|
36 |
(* the concatenation of the two buffers *)
|
17309
|
37 |
qc_def: "PRED qc == PRED (q2 @ q1)"
|
3807
|
38 |
|
17309
|
39 |
DBInit_def: "DBInit == PRED (BInit inp q1 mid & BInit mid q2 out)"
|
|
40 |
DBEnq_def: "DBEnq == ACT Enq inp q1 mid & unchanged (q2,out)"
|
|
41 |
DBDeq_def: "DBDeq == ACT Deq mid q2 out & unchanged (inp,q1)"
|
|
42 |
DBPass_def: "DBPass == ACT Deq inp q1 mid
|
6255
|
43 |
& (q2$ = $q2 @ [ mid$ ])
|
|
44 |
& (out$ = $out)"
|
17309
|
45 |
DBNext_def: "DBNext == ACT (DBEnq | DBDeq | DBPass)"
|
|
46 |
DBuffer_def: "DBuffer == TEMP Init DBInit
|
6255
|
47 |
& [][DBNext]_(inp,mid,out,q1,q2)
|
|
48 |
& WF(DBDeq)_(inp,mid,out,q1,q2)
|
|
49 |
& WF(DBPass)_(inp,mid,out,q1,q2)"
|
3807
|
50 |
|
17309
|
51 |
ML {* use_legacy_bindings (the_context ()) *}
|
|
52 |
|
3807
|
53 |
end |