src/HOL/UNITY/Client.thy
author paulson
Tue, 13 Oct 1998 10:32:59 +0200
changeset 5636 dd8f30780fa9
child 5648 fe887910e32e
permissions -rw-r--r--
Addition of HOL/UNITY/Client
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5636
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
     1
(*  Title:      HOL/UNITY/Client.thy
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
     2
    ID:         $Id$
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
     4
    Copyright   1998  University of Cambridge
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
     5
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
     6
Distributed Resource Management System: the Client
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
     7
*)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
     8
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
     9
Client = Comp + Prefix + 
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    10
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    11
constdefs  (*MOVE higher-up: UNITY.thy or Traces.thy ???*)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    12
  always :: "'a set => 'a program set"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    13
    "always A == {F. reachable F <= A}"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    14
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    15
  (*The traditional word for inductive properties.  Anyway, INDUCTIVE is
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    16
    reserved!*)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    17
  invariant :: "'a set => 'a program set"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    18
    "invariant A == {F. Init F <= A & stable (Acts F) A}"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    19
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    20
  (*Polymorphic in both states and the meaning of <= *)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    21
  increasing :: "['a => 'b::{ord}] => 'a program set"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    22
    "increasing f == {F. ALL z. stable (Acts F) {s. z <= f s}}"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    23
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    24
  (*The set of systems that regard "f" as local to F*)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    25
  localTo :: ['a => 'b, 'a program] => 'a program set  (infixl 80)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    26
    "f localTo F == {G. ALL z. stable (Acts G - Acts F) {s. f s = z}}"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    27
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    28
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    29
consts
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    30
  Max :: nat       (*Maximum number of tokens*)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    31
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    32
types
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    33
  tokbag = nat	   (*tokbags could be multisets...or any ordered type?*)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    34
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    35
record state =
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    36
  giv :: tokbag list   (*input history: tokens granted*)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    37
  ask :: tokbag list   (*output history: tokens requested*)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    38
  rel :: tokbag list   (*output history: tokens released*)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    39
  tok :: tokbag	       (*current token request*)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    40
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    41
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    42
(*Array indexing is translated to list indexing as A[n] == A!(n-1). *)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    43
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    44
constdefs
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    45
  
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    46
  (** Release some tokens **)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    47
  
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    48
  rel_act :: "(state*state) set"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    49
    "rel_act == {(s,s').
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    50
		  EX nrel. nrel = length (rel s) &
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    51
		           s' = s (| rel := rel s @ [giv s!nrel] |) &
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    52
		           nrel < length (giv s) &
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    53
		           ask s!nrel <= giv s!nrel}"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    54
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    55
  (** Choose a new token requirement **)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    56
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    57
  (** Including s'=s suppresses fairness, allowing the non-trivial part
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    58
      of the action to be ignored **)
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    59
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    60
  tok_act :: "(state*state) set"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    61
    "tok_act == {(s,s'). s'=s | (EX t: atMost Max. s' = s (|tok := t|))}"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    62
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    63
  ask_act :: "(state*state) set"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    64
    "ask_act == {(s,s'). s'=s |
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    65
		         (s' = s (|ask := ask s @ [tok s]|) &
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    66
		          length (ask s) = length (rel s))}"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    67
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    68
  Cli_prg :: state program
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    69
    "Cli_prg == mk_program ({s. tok s : atMost Max &
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    70
			        giv s = [] &
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    71
			        ask s = [] &
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    72
			        rel s = []},
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    73
			    {rel_act, tok_act, ask_act})"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    74
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    75
  giv_meets_ask :: state set
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    76
    "giv_meets_ask ==
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    77
       {s. length (giv s) <= length (ask s) & 
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    78
           (ALL n: lessThan (length (giv s)). ask s!n <= giv s!n)}"
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    79
dd8f30780fa9 Addition of HOL/UNITY/Client
paulson
parents:
diff changeset
    80
end