src/HOL/UNITY/Traces.ML
author paulson
Wed, 25 Nov 1998 15:53:04 +0100
changeset 5969 e4fe567d10e5
parent 5648 fe887910e32e
child 6012 1894bfc4aee9
permissions -rw-r--r--
new theorem program_equalityE
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5111
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
     1
(*  Title:      HOL/UNITY/Traces
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
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
     5
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
     6
Definitions of
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
     7
  * traces: the possible execution traces
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
     8
  * reachable: the set of reachable states
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
     9
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
    10
*)
8f4b72f0c15d Uncurried functions LeadsTo and reach
paulson
parents: 5069
diff changeset
    11
5596
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    12
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    13
(*** The abstract type of programs ***)
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    14
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    15
val rep_ss = simpset() addsimps 
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    16
                [Init_def, Acts_def, mk_program_def, Program_def, Rep_Program, 
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    17
		 Rep_Program_inverse, Abs_Program_inverse];
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    18
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    19
5620
3ac11c4af76a tidying and renaming
paulson
parents: 5608
diff changeset
    20
Goal "Id: Acts F";
3ac11c4af76a tidying and renaming
paulson
parents: 5608
diff changeset
    21
by (cut_inst_tac [("x", "F")] Rep_Program 1);
5596
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    22
by (auto_tac (claset(), rep_ss));
5608
a82a038a3e7a id <-> Id
nipkow
parents: 5596
diff changeset
    23
qed "Id_in_Acts";
a82a038a3e7a id <-> Id
nipkow
parents: 5596
diff changeset
    24
AddIffs [Id_in_Acts];
5584
aad639e56d4e Now id:(Acts prg) is implicit
paulson
parents: 5426
diff changeset
    25
aad639e56d4e Now id:(Acts prg) is implicit
paulson
parents: 5426
diff changeset
    26
5596
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    27
Goal "Init (mk_program (init,acts)) = init";
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    28
by (auto_tac (claset(), rep_ss));
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    29
qed "Init_eq";
4776
1f9362e769c1 New UNITY theory
paulson
parents:
diff changeset
    30
5608
a82a038a3e7a id <-> Id
nipkow
parents: 5596
diff changeset
    31
Goal "Acts (mk_program (init,acts)) = insert Id acts";
5596
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    32
by (auto_tac (claset(), rep_ss));
5423
c57c87628bb4 two new thms
paulson
parents: 5313
diff changeset
    33
qed "Acts_eq";
c57c87628bb4 two new thms
paulson
parents: 5313
diff changeset
    34
5596
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    35
Addsimps [Acts_eq, Init_eq];
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    36
5423
c57c87628bb4 two new thms
paulson
parents: 5313
diff changeset
    37
5620
3ac11c4af76a tidying and renaming
paulson
parents: 5608
diff changeset
    38
Goal "[| Init F = Init G; Acts F = Acts G |] ==> F = G";
3ac11c4af76a tidying and renaming
paulson
parents: 5608
diff changeset
    39
by (cut_inst_tac [("p", "Rep_Program F")] surjective_pairing 1);
5596
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    40
by (auto_tac (claset(), rep_ss));
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    41
by (dres_inst_tac [("f", "Abs_Program")] arg_cong 1);
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    42
by (full_simp_tac (rep_ss addsimps [surjective_pairing RS sym]) 1);
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    43
qed "program_equalityI";
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    44
5969
e4fe567d10e5 new theorem program_equalityE
paulson
parents: 5648
diff changeset
    45
val [major,minor] =
e4fe567d10e5 new theorem program_equalityE
paulson
parents: 5648
diff changeset
    46
Goal "[| F = G; [| Init F = Init G; Acts F = Acts G |] ==> P |] ==> P";
e4fe567d10e5 new theorem program_equalityE
paulson
parents: 5648
diff changeset
    47
by (rtac minor 1);
e4fe567d10e5 new theorem program_equalityE
paulson
parents: 5648
diff changeset
    48
by (auto_tac (claset(), simpset() addsimps [major]));
e4fe567d10e5 new theorem program_equalityE
paulson
parents: 5648
diff changeset
    49
qed "program_equalityE";
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    50
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5620
diff changeset
    51
(*** These rules allow "lazy" definition expansion ***)
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    52
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5620
diff changeset
    53
(*The program is not expanded, but its Init is*)
fe887910e32e specifications as sets of programs
paulson
parents: 5620
diff changeset
    54
val [rew] = goal thy
fe887910e32e specifications as sets of programs
paulson
parents: 5620
diff changeset
    55
    "[| F == mk_program (init,acts) |] \
fe887910e32e specifications as sets of programs
paulson
parents: 5620
diff changeset
    56
\    ==> Init F = init";
fe887910e32e specifications as sets of programs
paulson
parents: 5620
diff changeset
    57
by (rewtac rew);
fe887910e32e specifications as sets of programs
paulson
parents: 5620
diff changeset
    58
by Auto_tac;
fe887910e32e specifications as sets of programs
paulson
parents: 5620
diff changeset
    59
qed "def_prg_Init";
fe887910e32e specifications as sets of programs
paulson
parents: 5620
diff changeset
    60
fe887910e32e specifications as sets of programs
paulson
parents: 5620
diff changeset
    61
(*The program is not expanded, but its Init and Acts are*)
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    62
val [rew] = goal thy
5620
3ac11c4af76a tidying and renaming
paulson
parents: 5608
diff changeset
    63
    "[| F == mk_program (init,acts) |] \
3ac11c4af76a tidying and renaming
paulson
parents: 5608
diff changeset
    64
\    ==> Init F = init & Acts F = insert Id acts";
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    65
by (rewtac rew);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    66
by Auto_tac;
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    67
qed "def_prg_simps";
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    68
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5620
diff changeset
    69
(*An action is expanded only if a pair of states is being tested against it*)
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    70
val [rew] = goal thy
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    71
    "[| act == {(s,s'). P s s'} |] ==> ((s,s') : act) = P s s'";
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    72
by (rewtac rew);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    73
by Auto_tac;
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    74
qed "def_act_simp";
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    75
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    76
fun simp_of_act def = def RS def_act_simp;
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    77
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5620
diff changeset
    78
(*A set is expanded only if an element is being tested against it*)
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    79
val [rew] = goal thy
5648
fe887910e32e specifications as sets of programs
paulson
parents: 5620
diff changeset
    80
    "A == B ==> (x : A) = (x : B)";
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    81
by (rewtac rew);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    82
by Auto_tac;
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    83
qed "def_set_simp";
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    84
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    85
fun simp_of_set def = def RS def_set_simp;
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5423
diff changeset
    86
5596
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    87
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    88
(*** traces and reachable ***)
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    89
5620
3ac11c4af76a tidying and renaming
paulson
parents: 5608
diff changeset
    90
Goal "reachable F = {s. EX evs. (s,evs): traces (Init F) (Acts F)}";
5596
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    91
by Safe_tac;
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    92
by (etac traces.induct 2);
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    93
by (etac reachable.induct 1);
5620
3ac11c4af76a tidying and renaming
paulson
parents: 5608
diff changeset
    94
by (ALLGOALS (blast_tac (claset() addIs reachable.intrs @ traces.intrs)));
5596
b29d18d8c4d2 abstype of programs
paulson
parents: 5584
diff changeset
    95
qed "reachable_equiv_traces";