src/HOL/UNITY/Mutex.thy
author wenzelm
Mon, 13 Mar 2000 13:21:39 +0100
changeset 8434 5e4bba59bfaa
parent 6570 a7d7985050a9
child 10064 1a77667b21ef
permissions -rw-r--r--
use HOLogic.Not; export indexify_names;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
     1
(*  Title:      HOL/UNITY/Mutex.thy
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
     2
    ID:         $Id$
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
     4
    Copyright   1998  University of Cambridge
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
     5
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
     6
Based on "A Family of 2-Process Mutual Exclusion Algorithms" by J Misra
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
     7
*)
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
     8
5240
bbcd79ef7cf2 Constant "invariant" and new constrains_tac, ensures_tac
paulson
parents: 5232
diff changeset
     9
Mutex = SubstAx +
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    10
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    11
record state =
6565
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    12
  p :: bool
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    13
  m :: int
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    14
  n :: int
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    15
  u :: bool
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    16
  v :: bool
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    17
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    18
types command = "(state*state) set"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    19
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    20
constdefs
5253
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    21
  
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    22
  (** The program for process U **)
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    23
  
6565
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    24
  U0 :: command
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    25
    "U0 == {(s,s'). s' = s (|u:=True, m:=#1|) & m s = #0}"
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    26
6565
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    27
  U1 :: command
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    28
    "U1 == {(s,s'). s' = s (|p:= v s, m:=#2|) & m s = #1}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    29
6565
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    30
  U2 :: command
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    31
    "U2 == {(s,s'). s' = s (|m:=#3|) & ~ p s & m s = #2}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    32
6565
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    33
  U3 :: command
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    34
    "U3 == {(s,s'). s' = s (|u:=False, m:=#4|) & m s = #3}"
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    35
6565
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    36
  U4 :: command
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    37
    "U4 == {(s,s'). s' = s (|p:=True, m:=#0|) & m s = #4}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    38
5253
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    39
  (** The program for process V **)
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    40
  
6565
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    41
  V0 :: command
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    42
    "V0 == {(s,s'). s' = s (|v:=True, n:=#1|) & n s = #0}"
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    43
6565
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    44
  V1 :: command
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    45
    "V1 == {(s,s'). s' = s (|p:= ~ u s, n:=#2|) & n s = #1}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    46
6565
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    47
  V2 :: command
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    48
    "V2 == {(s,s'). s' = s (|n:=#3|) & p s & n s = #2}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    49
6565
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    50
  V3 :: command
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    51
    "V3 == {(s,s'). s' = s (|v:=False, n:=#4|) & n s = #3}"
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    52
6565
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    53
  V4 :: command
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    54
    "V4 == {(s,s'). s' = s (|p:=False, n:=#0|) & n s = #4}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    55
6565
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    56
  Mutex :: state program
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    57
    "Mutex == mk_program ({s. ~ u s & ~ v s & m s = #0 & n s = #0},
de4acf4449fa renamed state variables
paulson
parents: 6295
diff changeset
    58
		 	  {U0, U1, U2, U3, U4, V0, V1, V2, V3, V4})"
5253
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    59
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    60
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    61
  (** The correct invariants **)
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    62
6570
a7d7985050a9 Invariant -> Always and other tidying
paulson
parents: 6565
diff changeset
    63
  IU :: state set
a7d7985050a9 Invariant -> Always and other tidying
paulson
parents: 6565
diff changeset
    64
    "IU == {s. (u s = (#1 <= m s & m s <= #3)) & (m s = #3 --> ~ p s)}"
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    65
6570
a7d7985050a9 Invariant -> Always and other tidying
paulson
parents: 6565
diff changeset
    66
  IV :: state set
a7d7985050a9 Invariant -> Always and other tidying
paulson
parents: 6565
diff changeset
    67
    "IV == {s. (v s = (#1 <= n s & n s <= #3)) & (n s = #3 --> p s)}"
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    68
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    69
  (** The faulty invariant (for U alone) **)
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    70
6570
a7d7985050a9 Invariant -> Always and other tidying
paulson
parents: 6565
diff changeset
    71
  bad_IU :: state set
a7d7985050a9 Invariant -> Always and other tidying
paulson
parents: 6565
diff changeset
    72
    "bad_IU == {s. (u s = (#1 <= m s & m s <= #3)) &
a7d7985050a9 Invariant -> Always and other tidying
paulson
parents: 6565
diff changeset
    73
	           (#3 <= m s & m s <= #4 --> ~ p s)}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    74
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    75
end