11479
|
1 |
(* Title: ZF/UNITY/Mutex.thy
|
|
2 |
ID: $Id$
|
|
3 |
Author: Sidi O Ehmety, Computer Laboratory
|
|
4 |
Copyright 2001 University of Cambridge
|
|
5 |
|
|
6 |
Based on "A Family of 2-Process Mutual Exclusion Algorithms" by J Misra
|
|
7 |
|
|
8 |
Variables' types are introduced globally so that type verification of
|
|
9 |
UNITY programs/specifications reduce to the usual ZF typechecking.
|
|
10 |
An ill-tyed expression will reduce to the empty set.
|
|
11 |
*)
|
|
12 |
|
|
13 |
Mutex = SubstAx +
|
|
14 |
consts
|
|
15 |
p, m, n, u, v :: i
|
|
16 |
|
|
17 |
translations
|
|
18 |
"p" == "Var([])"
|
|
19 |
"m" == "Var([0])"
|
|
20 |
"n" == "Var([1])"
|
|
21 |
"u" == "Var([1,0])"
|
|
22 |
"v" == "Var([1,1])"
|
|
23 |
|
|
24 |
rules (** Type declarations **)
|
|
25 |
p_type "type_of(p)=bool"
|
|
26 |
m_type "type_of(m)=int"
|
|
27 |
n_type "type_of(n)=int"
|
|
28 |
u_type "type_of(u)=bool"
|
|
29 |
v_type "type_of(v)=bool"
|
|
30 |
|
|
31 |
constdefs
|
|
32 |
(** The program for process U **)
|
|
33 |
U0 :: i
|
|
34 |
"U0 == {<s,t>:state*state. t = s(u:=1, m:=#1) & s`m = #0}"
|
|
35 |
|
|
36 |
U1 :: i
|
|
37 |
"U1 == {<s,t>:state*state. t = s(p:= s`v, m:=#2) & s`m = #1}"
|
|
38 |
|
|
39 |
U2 :: i
|
|
40 |
"U2 == {<s,t>:state*state. t = s(m:=#3) & s`p=0 & s`m = #2}"
|
|
41 |
|
|
42 |
U3 :: i
|
|
43 |
"U3 == {<s,t>:state*state. t=s(u:=0, m:=#4) & s`m = #3}"
|
|
44 |
|
|
45 |
U4 :: i
|
|
46 |
"U4 == {<s,t>:state*state. t = s(p:=1, m:=#0) & s`m = #4}"
|
|
47 |
|
|
48 |
|
|
49 |
(** The program for process V **)
|
|
50 |
|
|
51 |
V0 :: i
|
|
52 |
"V0 == {<s,t>:state*state. t = s (v:=1, n:=#1) & s`n = #0}"
|
|
53 |
|
|
54 |
V1 :: i
|
|
55 |
"V1 == {<s,t>:state*state. t = s(p:=not(s`u), n:=#2) & s`n = #1}"
|
|
56 |
|
|
57 |
V2 :: i
|
|
58 |
"V2 == {<s,t>:state*state. t = s(n:=#3) & s`p=1 & s`n = #2}"
|
|
59 |
|
|
60 |
V3 :: i
|
|
61 |
"V3 == {<s,t>:state*state. t = s (v:=0, n:=#4) & s`n = #3}"
|
|
62 |
|
|
63 |
V4 :: i
|
|
64 |
"V4 == {<s,t>:state*state. t = s (p:=0, n:=#0) & s`n = #4}"
|
|
65 |
|
|
66 |
Mutex :: i
|
|
67 |
"Mutex == mk_program({s:state. s`u=0 & s`v=0 & s`m = #0 & s`n = #0},
|
|
68 |
{U0, U1, U2, U3, U4, V0, V1, V2, V3, V4}, action)"
|
|
69 |
|
|
70 |
(** The correct invariants **)
|
|
71 |
|
|
72 |
IU :: i
|
|
73 |
"IU == {s:state. (s`u = 1<->(#1 $<= s`m & s`m $<= #3))
|
|
74 |
& (s`m = #3 --> s`p=0)}"
|
|
75 |
|
|
76 |
IV :: i
|
|
77 |
"IV == {s:state. (s`v = 1 <-> (#1 $<= s`n & s`n $<= #3))
|
|
78 |
& (s`n = #3 --> s`p=1)}"
|
|
79 |
|
|
80 |
(** The faulty invariant (for U alone) **)
|
|
81 |
|
|
82 |
bad_IU :: i
|
|
83 |
"bad_IU == {s:state. (s`u = 1 <-> (#1 $<= s`m & s`m $<= #3))&
|
|
84 |
(#3 $<= s`m & s`m $<= #4 --> s`p=0)}"
|
|
85 |
|
|
86 |
end |