src/HOL/UNITY/Token.thy
changeset 4776 1f9362e769c1
child 5232 e5a7cdd07ea5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/UNITY/Token.thy	Fri Apr 03 12:34:33 1998 +0200
@@ -0,0 +1,71 @@
+(*  Title:      HOL/UNITY/Token
+    ID:         $Id$
+    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
+    Copyright   1998  University of Cambridge
+
+The Token Ring.
+
+From Misra, "A Logic for Concurrent Programming" (1994), sections 5.2 and 13.2.
+*)
+
+
+Token = WFair +
+
+(*process states*)
+datatype pstate = Hungry | Eating | Thinking | Pnum nat
+
+types state = nat => pstate
+
+consts
+  N :: nat	(*number of nodes in the ring*)
+
+constdefs
+  nodeOrder :: "nat => (nat*nat)set"
+    "nodeOrder j == (inv_image less_than (%i. ((j+N)-i) mod N))  Int
+                    (lessThan N Times lessThan N)"
+
+  next      :: nat => nat
+    "next i == (Suc i) mod N"
+
+  WellTyped :: state set
+    "WellTyped == {s. ALL i j. s (Suc i) ~= Pnum j}"
+
+  Token :: state => nat
+    "Token s == case s 0 of 
+                    Hungry => 0
+                  | Eating => 0
+                  | Thinking => 0
+                  | Pnum i => i"
+
+  HasTok :: nat => state set
+    "HasTok i == Token -`` {i}"
+
+  H :: nat => state set
+    "H i == {s. s (Suc i) = Hungry}"
+
+  E :: nat => state set
+    "E i == {s. s (Suc i) = Eating}"
+
+  T :: nat => state set
+    "T i == {s. s (Suc i) = Thinking}"
+
+rules
+  N_positive "0<N"
+
+  stable_WT  "stable Acts WellTyped"
+
+  skip "id: Acts"
+
+  TR2  "constrains Acts (T i) (T i Un H i)"
+
+  TR3  "constrains Acts (H i) (H i Un E i)"
+
+  TR4  "constrains Acts (H i - HasTok i) (H i)"
+
+  TR5  "constrains Acts (HasTok i) (HasTok i Un Compl(E i))"
+
+  TR6  "leadsTo Acts (H i Int HasTok i) (E i)"
+
+  TR7  "leadsTo Acts (HasTok i) (HasTok (next i))"
+
+end