src/HOL/UNITY/Counter.thy
author paulson
Wed, 14 Feb 2001 12:16:32 +0100
changeset 11115 285b31e9e026
parent 10782 ddb433987557
permissions -rw-r--r--
a new theorem from Bryan Ford
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10782
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     1
(*  Title:      HOL/UNITY/Counter
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     2
    ID:         $Id$
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     3
    Author:     Sidi O Ehmety, Cambridge University Computer Laboratory
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     4
    Copyright   2001  University of Cambridge
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     5
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     6
A family of similar counters, version close to the original. 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     7
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     8
From Charpentier and Chandy,
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     9
Examples of Program Composition Illustrating the Use of Universal Properties
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    10
   In J. Rolim (editor), Parallel and Distributed Processing,
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    11
   Spriner LNCS 1586 (1999), pages 1215-1227.
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    12
*)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    13
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    14
Counter =  Comp +
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    15
(* Variables are names *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    16
datatype name = C | c nat
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    17
types state = name=>int
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    18
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    19
consts  
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    20
  sum  :: "[nat,state]=>int"
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    21
  sumj :: "[nat, nat, state]=>int"
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    22
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    23
primrec (* sum I s = sigma_{i<I}. s (c i) *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    24
  "sum 0 s = #0"
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    25
  "sum (Suc i) s = s (c i) + sum i s"
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    26
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    27
primrec
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    28
  "sumj 0 i s = #0"
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    29
  "sumj (Suc n) i s = (if n=i then sum n s else s (c n) + sumj n i s)"
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    30
  
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    31
types command = "(state*state)set"
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    32
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    33
constdefs
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    34
  a :: "nat=>command"
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    35
 "a i == {(s, s'). s'=s(c i:= s (c i) + #1, C:= s C + #1)}"
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    36
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    37
  Component :: "nat => state program"
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    38
  "Component i ==
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    39
    mk_program({s. s C = #0 & s (c i) = #0}, {a i},
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    40
	       UN G: preserves (%s. s (c i)). Acts G)"
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    41
end