src/HOL/UNITY/Mutex.thy
author paulson
Wed, 05 Aug 1998 10:57:25 +0200
changeset 5253 82a5ca6290aa
parent 5240 bbcd79ef7cf2
child 5584 aad639e56d4e
permissions -rw-r--r--
New record type of programs
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
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    11
(*WE NEED A GENERAL TREATMENT OF NUMBERS!!*)
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    12
syntax
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    13
  "3"       :: nat                ("3")
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    14
  "4"       :: nat                ("4")
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    15
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    16
translations
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    17
   "3"  == "Suc 2"
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    18
   "4"  == "Suc 3"
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    19
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    20
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    21
record state =
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    22
  PP :: bool
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    23
  MM :: nat
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    24
  NN :: nat
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    25
  UU :: bool
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    26
  VV :: bool
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    27
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    28
constdefs
5253
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    29
  
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    30
  (** The program for process U **)
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    31
  
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    32
  cmd0U :: "(state*state) set"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    33
    "cmd0U == {(s,s'). s' = s (|UU:=True, MM:=1|) & MM s = 0}"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    34
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    35
  cmd1U :: "(state*state) set"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    36
    "cmd1U == {(s,s'). s' = s (|PP:= VV s, MM:=2|) & MM s = 1}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    37
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    38
  cmd2U :: "(state*state) set"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    39
    "cmd2U == {(s,s'). s' = s (|MM:=3|) & ~ PP s & MM s = 2}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    40
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    41
  cmd3U :: "(state*state) set"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    42
    "cmd3U == {(s,s'). s' = s (|UU:=False, MM:=4|) & MM s = 3}"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    43
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    44
  cmd4U :: "(state*state) set"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    45
    "cmd4U == {(s,s'). s' = s (|PP:=True, MM:=0|) & MM s = 4}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    46
5253
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    47
  (** The program for process V **)
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    48
  
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    49
  cmd0V :: "(state*state) set"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    50
    "cmd0V == {(s,s'). s' = s (|VV:=True, NN:=1|) & NN s = 0}"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    51
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    52
  cmd1V :: "(state*state) set"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    53
    "cmd1V == {(s,s'). s' = s (|PP:= ~ UU s, NN:=2|) & NN s = 1}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    54
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    55
  cmd2V :: "(state*state) set"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    56
    "cmd2V == {(s,s'). s' = s (|NN:=3|) & PP s & NN s = 2}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    57
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    58
  cmd3V :: "(state*state) set"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    59
    "cmd3V == {(s,s'). s' = s (|VV:=False, NN:=4|) & NN s = 3}"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    60
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    61
  cmd4V :: "(state*state) set"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    62
    "cmd4V == {(s,s'). s' = s (|PP:=False, NN:=0|) & NN s = 4}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    63
5253
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    64
  Mprg :: state program
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    65
    "Mprg == (|Init = {s. ~ UU s & ~ VV s & MM s = 0 & NN s = 0},
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    66
	       Acts = {id,
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    67
	               cmd0U, cmd1U, cmd2U, cmd3U, cmd4U, 
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    68
	               cmd0V, cmd1V, cmd2V, cmd3V, cmd4V}|)"
82a5ca6290aa New record type of programs
paulson
parents: 5240
diff changeset
    69
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    70
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    71
  (** The correct invariants **)
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    72
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    73
  invariantU :: "state set"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    74
    "invariantU == {s. (UU s = (1 <= MM s & MM s <= 3)) &
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    75
		       (MM s = 3 --> ~ PP s)}"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    76
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    77
  invariantV :: "state set"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    78
    "invariantV == {s. (VV s = (1 <= NN s & NN s <= 3)) &
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    79
		       (NN s = 3 --> PP s)}"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    80
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    81
  (** The faulty invariant (for U alone) **)
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    82
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    83
  bad_invariantU :: "state set"
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    84
    "bad_invariantU == {s. (UU s = (1 <= MM s & MM s <= 3)) &
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5071
diff changeset
    85
		           (3 <= MM s & MM s <= 4 --> ~ PP s)}"
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    86
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    87
end