src/HOL/UNITY/Deadlock.ML
author wenzelm
Mon, 09 Nov 1998 15:34:23 +0100
changeset 5830 95b619c7289b
parent 5648 fe887910e32e
child 6536 281d44905cab
permissions -rw-r--r--
Derived theory operations.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5232
e5a7cdd07ea5 Tidied; uses records
paulson
parents: 5111
diff changeset
     1
(*  Title:      HOL/UNITY/Deadlock
5111
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
     2
    ID:         $Id$
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
     4
    Copyright   1998  University of Cambridge
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
     5
5111
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
     6
Deadlock examples from section 5.6 of 
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
     7
    Misra, "A Logic for Concurrent Programming", 1994
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
     8
*)
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
     9
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    10
(*Trivial, two-process case*)
5069
3ea049f7979d isatool fixgoal;
wenzelm
parents: 4776
diff changeset
    11
Goalw [constrains_def, stable_def]
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    12
    "[| F : constrains (A Int B) A;  F : constrains (B Int A) B |] \
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    13
\    ==> F : stable (A Int B)";
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    14
by (Blast_tac 1);
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    15
result();
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    16
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    17
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    18
(*a simplification step*)
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    19
Goal "(INT i: atMost n. A(Suc i) Int A i) = \
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    20
\     (INT i: atMost (Suc n). A i)";
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    21
by (induct_tac "n" 1);
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    22
by (ALLGOALS (asm_simp_tac (simpset() addsimps [atMost_Suc])));
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    23
by (blast_tac (claset() addEs [le_SucE] addSEs [equalityE]) 1);
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    24
qed "Collect_le_Int_equals";
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    25
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    26
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    27
(*Dual of the required property.  Converse inclusion fails.*)
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    28
Goal "(UN i: lessThan n. A i) Int -(A n) <=  \
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    29
\     (UN i: lessThan n. (A i) Int -(A(Suc i)))";
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    30
by (induct_tac "n" 1);
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    31
by (Asm_simp_tac 1);
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    32
by (simp_tac (simpset() addsimps [lessThan_Suc]) 1);
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    33
by (Blast_tac 1);
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    34
qed "UN_Int_Compl_subset";
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    35
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    36
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    37
(*Converse inclusion fails.*)
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    38
Goal "(INT i: lessThan n. -A i Un A (Suc i))  <= \
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    39
\     (INT i: lessThan n. -A i) Un A n";
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    40
by (induct_tac "n" 1);
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    41
by (Asm_simp_tac 1);
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    42
by (asm_simp_tac (simpset() addsimps [lessThan_Suc]) 1);
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    43
by (Blast_tac 1);
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    44
qed "INT_Un_Compl_subset";
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    45
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    46
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    47
(*Specialized rewriting*)
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    48
Goal "A 0 Int (-(A n) Int (INT i: lessThan n. -A i Un A (Suc i))) = {}";
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    49
by (blast_tac (claset() addIs [gr0I]
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    50
		        addDs [impOfSubs INT_Un_Compl_subset]) 1);
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    51
val lemma = result();
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    52
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    53
(*Reverse direction makes it harder to invoke the ind hyp*)
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    54
Goal "(INT i: atMost n. A i) = \
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    55
\         A 0 Int (INT i: lessThan n. -A i Un A(Suc i))";
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    56
by (induct_tac "n" 1);
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    57
by (Asm_simp_tac 1);
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    58
by (asm_simp_tac
5536
130f3d891fb2 tidying and deleting needless parentheses
paulson
parents: 5502
diff changeset
    59
    (simpset() addsimps Int_ac @
130f3d891fb2 tidying and deleting needless parentheses
paulson
parents: 5502
diff changeset
    60
			[Int_Un_distrib, Int_Un_distrib2, lemma,
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    61
			 lessThan_Suc, atMost_Suc]) 1);
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    62
qed "INT_le_equals_Int";
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    63
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    64
Goal "(INT i: atMost (Suc n). A i) = \
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    65
\         A 0 Int (INT i: atMost n. -A i Un A(Suc i))";
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    66
by (simp_tac (simpset() addsimps [lessThan_Suc_atMost, INT_le_equals_Int]) 1);
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    67
qed "INT_le_Suc_equals_Int";
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    68
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    69
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    70
(*The final deadlock example*)
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    71
val [zeroprem, allprem] = goalw thy [stable_def]
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    72
    "[| F : constrains (A 0 Int A (Suc n)) (A 0);  \
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    73
\       ALL i: atMost n. F : constrains (A(Suc i) Int A i) \
5490
85855f65d0c6 From Compl(A) to -A
paulson
parents: 5232
diff changeset
    74
\                                         (-A i Un A(Suc i)) |] \
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5536
diff changeset
    75
\    ==> F : stable (INT i: atMost (Suc n). A i)";
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    76
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    77
by (rtac ([zeroprem, allprem RS ball_constrains_INT] MRS 
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    78
    constrains_Int RS constrains_weaken) 1);
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    79
by (simp_tac (simpset() addsimps [Collect_le_Int_equals, 
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    80
				  Int_assoc, INT_absorb]) 1);
5536
130f3d891fb2 tidying and deleting needless parentheses
paulson
parents: 5502
diff changeset
    81
by (simp_tac (simpset() addsimps [INT_le_Suc_equals_Int]) 1);
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    82
result();
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    83