src/HOL/TLA/Action.ML
author wenzelm
Wed, 07 Sep 2005 20:22:39 +0200
changeset 17309 c43ed29bd197
parent 14100 804be4c4b642
permissions -rw-r--r--
converted to Isar theory format;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
     1
(*
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
     2
    File:        Action.ML
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
     3
    ID:          $Id$
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
     4
    Author:      Stephan Merz
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
     5
    Copyright:   1997 University of Munich
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
     6
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
     7
Lemmas and tactics for TLA actions.
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
     8
*)
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
     9
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
    10
(* The following assertion specializes "intI" for any world type
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    11
   which is a pair, not just for "state * state".
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    12
*)
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
    13
val [prem] = goal (the_context ()) "(!!s t. (s,t) |= A) ==> |- A";
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    14
by (REPEAT (resolve_tac [prem,intI,prod_induct] 1));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    15
qed "actionI";
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    16
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    17
Goal "|- A ==> (s,t) |= A";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    18
by (etac intD 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    19
qed "actionD";
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    20
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    21
local
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
    22
  fun prover s = prove_goal (the_context ()) s
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
    23
                    (fn _ => [rtac actionI 1,
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    24
                              rewrite_goals_tac (unl_after::intensional_rews),
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    25
                              rtac refl 1])
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    26
in
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    27
  val pr_rews = map (int_rewrite o prover)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    28
    [ "|- (#c)` = #c",
14100
804be4c4b642 added map_image, restrict_map, some thms
oheimb
parents: 9517
diff changeset
    29
      "|- f<x>` = f<x` >",
804be4c4b642 added map_image, restrict_map, some thms
oheimb
parents: 9517
diff changeset
    30
      "|- f<x,y>` = f<x`,y` >",
804be4c4b642 added map_image, restrict_map, some thms
oheimb
parents: 9517
diff changeset
    31
      "|- f<x,y,z>` = f<x`,y`,z` >",
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    32
      "|- (! x. P x)` = (! x. (P x)`)",
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    33
      "|- (? x. P x)` = (? x. (P x)`)"
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    34
    ]
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    35
end;
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    36
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    37
val act_rews = [unl_before,unl_after,unchanged_def] @ pr_rews;
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    38
Addsimps act_rews;
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    39
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    40
val action_rews = act_rews @ intensional_rews;
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    41
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    42
(* ================ Functions to "unlift" action theorems into HOL rules ================ *)
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    43
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    44
(* The following functions are specialized versions of the corresponding
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    45
   functions defined in Intensional.ML in that they introduce a
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    46
   "world" parameter of the form (s,t) and apply additional rewrites.
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    47
*)
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
    48
fun action_unlift th =
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
    49
    (rewrite_rule action_rews (th RS actionD))
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    50
    handle _ => int_unlift th;
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    51
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    52
(* Turn  |- A = B  into meta-level rewrite rule  A == B *)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    53
val action_rewrite = int_rewrite;
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    54
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    55
fun action_use th =
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    56
    case (concl_of th) of
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    57
      Const _ $ (Const ("Intensional.Valid", _) $ _) =>
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    58
              ((flatten (action_unlift th)) handle _ => th)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    59
    | _ => th;
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    60
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    61
(* ===================== Update simpset and classical prover ============================= *)
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    62
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    63
AddSIs [actionI];
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    64
AddDs  [actionD];
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    65
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    66
(* =========================== square / angle brackets =========================== *)
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    67
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    68
Goalw [square_def] "(s,t) |= unchanged v ==> (s,t) |= [A]_v";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    69
by (Asm_full_simp_tac 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    70
qed "idle_squareI";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    71
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    72
Goalw [square_def] "(s,t) |= A ==> (s,t) |= [A]_v";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    73
by (Asm_simp_tac 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    74
qed "busy_squareI";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    75
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
    76
val prems = goal (the_context ())
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    77
  "[| (s,t) |= [A]_v; A (s,t) ==> B (s,t); v t = v s ==> B (s,t) |] ==> B (s,t)";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    78
by (cut_facts_tac prems 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    79
by (rewrite_goals_tac (square_def::action_rews));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    80
by (etac disjE 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    81
by (REPEAT (eresolve_tac prems 1));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    82
qed "squareE";
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    83
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
    84
val prems = goalw (the_context ()) (square_def::action_rews)
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    85
  "[| v t ~= v s ==> A (s,t) |] ==> (s,t) |= [A]_v";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    86
by (rtac disjCI 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    87
by (eresolve_tac prems 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    88
qed "squareCI";
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
    89
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
    90
goalw (the_context ()) [angle_def]
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    91
  "!!s t. [| A (s,t); v t ~= v s |] ==> (s,t) |= <A>_v";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    92
by (Asm_simp_tac 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    93
qed "angleI";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    94
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
    95
val prems = goalw (the_context ()) (angle_def::action_rews)
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    96
  "[| (s,t) |= <A>_v; [| A (s,t); v t ~= v s |] ==> R |] ==> R";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    97
by (cut_facts_tac prems 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    98
by (etac conjE 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
    99
by (REPEAT (ares_tac prems 1));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   100
qed "angleE";
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   101
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   102
AddIs [angleI, squareCI];
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   103
AddEs [angleE, squareE];
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   104
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   105
goal (the_context ())
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   106
   "!!f. [| |- unchanged f & ~B --> unchanged g;   \
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   107
\           |- A & ~unchanged g --> B              \
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   108
\        |] ==> |- [A]_f --> [B]_g";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   109
by (Clarsimp_tac 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   110
by (etac squareE 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   111
by (auto_tac (claset(), simpset() addsimps [square_def]));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   112
qed "square_simulation";
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   113
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   114
goalw (the_context ()) [square_def,angle_def]
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   115
   "|- (~ [A]_v) = <~A>_v";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   116
by Auto_tac;
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   117
qed "not_square";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   118
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   119
goalw (the_context ()) [square_def,angle_def]
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   120
   "|- (~ <A>_v) = [~A]_v";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   121
by Auto_tac;
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   122
qed "not_angle";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   123
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   124
(* ============================== Facts about ENABLED ============================== *)
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   125
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   126
goal (the_context ()) "|- A --> $Enabled A";
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   127
by (auto_tac (claset(), simpset() addsimps [enabled_def]));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   128
qed "enabledI";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   129
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   130
val prems = goalw (the_context ()) [enabled_def]
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   131
  "[| s |= Enabled A; !!u. A (s,u) ==> Q |] ==> Q";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   132
by (cut_facts_tac prems 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   133
by (etac exE 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   134
by (resolve_tac prems 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   135
by (atac 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   136
qed "enabledE";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   137
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   138
goal (the_context ()) "|- ~$Enabled G --> ~ G";
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   139
by (auto_tac (claset(), simpset() addsimps [enabled_def]));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   140
qed "notEnabledD";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   141
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   142
(* Monotonicity *)
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   143
val [min,maj] = goal (the_context ())
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   144
  "[| s |= Enabled F; |- F --> G |] ==> s |= Enabled G";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   145
by (rtac (min RS enabledE) 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   146
by (rtac (action_use enabledI) 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   147
by (etac (action_use maj) 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   148
qed "enabled_mono";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   149
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   150
(* stronger variant *)
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   151
val [min,maj] = goal (the_context ())
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   152
  "[| s |= Enabled F; !!t. F (s,t) ==> G (s,t) |] ==> s |= Enabled G";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   153
by (rtac (min RS enabledE) 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   154
by (rtac (action_use enabledI) 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   155
by (etac maj 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   156
qed "enabled_mono2";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   157
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   158
goal (the_context ()) "|- Enabled F --> Enabled (F | G)";
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   159
by (auto_tac (claset() addSEs [enabled_mono], simpset()));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   160
qed "enabled_disj1";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   161
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   162
goal (the_context ()) "|- Enabled G --> Enabled (F | G)";
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   163
by (auto_tac (claset() addSEs [enabled_mono], simpset()));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   164
qed "enabled_disj2";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   165
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   166
goal (the_context ()) "|- Enabled (F & G) --> Enabled F";
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   167
by (auto_tac (claset() addSEs [enabled_mono], simpset()));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   168
qed "enabled_conj1";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   169
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   170
goal (the_context ()) "|- Enabled (F & G) --> Enabled G";
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   171
by (auto_tac (claset() addSEs [enabled_mono], simpset()));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   172
qed "enabled_conj2";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   173
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   174
val prems = goal (the_context ())
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   175
  "[| s |= Enabled (F & G); [| s |= Enabled F; s |= Enabled G |] ==> Q |] ==> Q";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   176
by (cut_facts_tac prems 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   177
by (resolve_tac prems 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   178
by (etac (action_use enabled_conj1) 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   179
by (etac (action_use enabled_conj2) 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   180
qed "enabled_conjE";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   181
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   182
goal (the_context ()) "|- Enabled (F | G) --> Enabled F | Enabled G";
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   183
by (auto_tac (claset(), simpset() addsimps [enabled_def]));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   184
qed "enabled_disjD";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   185
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   186
goal (the_context ()) "|- Enabled (F | G) = (Enabled F | Enabled G)";
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   187
by (Clarsimp_tac 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   188
by (rtac iffI 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   189
by (etac (action_use enabled_disjD) 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   190
by (REPEAT (eresolve_tac (disjE::map action_use [enabled_disj1,enabled_disj2]) 1));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   191
qed "enabled_disj";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   192
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   193
goal (the_context ()) "|- Enabled (EX x. F x) = (EX x. Enabled (F x))";
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   194
by (force_tac (claset(), simpset() addsimps [enabled_def]) 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   195
qed "enabled_ex";
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   196
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   197
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   198
(* A rule that combines enabledI and baseE, but generates fewer instantiations *)
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   199
val prems = goal (the_context ())
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   200
  "[| basevars vs; EX c. ! u. vs u = c --> A(s,u) |] ==> s |= Enabled A";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   201
by (cut_facts_tac prems 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   202
by (etac exE 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   203
by (etac baseE 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   204
by (rtac (action_use enabledI) 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   205
by (etac allE 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   206
by (etac mp 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   207
by (atac 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   208
qed "base_enabled";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   209
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 7881
diff changeset
   210
(* ======================= action_simp_tac ============================== *)
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   211
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   212
(* A dumb simplification-based tactic with just a little first-order logic:
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   213
   should plug in only "very safe" rules that can be applied blindly.
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   214
   Note that it applies whatever simplifications are currently active.
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   215
*)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   216
fun action_simp_tac ss intros elims =
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   217
    asm_full_simp_tac
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   218
         (ss setloop ((resolve_tac ((map action_use intros)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   219
                                    @ [refl,impI,conjI,actionI,intI,allI]))
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   220
                      ORELSE' (eresolve_tac ((map action_use elims)
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   221
                                             @ [conjE,disjE,exE]))));
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   222
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   223
(* default version without additional plug-in rules *)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   224
val Action_simp_tac = action_simp_tac (simpset()) [] [];
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   225
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   226
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   227
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   228
(* ---------------- enabled_tac: tactic to prove (Enabled A) -------------------- *)
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   229
(* "Enabled A" can be proven as follows:
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   230
   - Assume that we know which state variables are "base variables";
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   231
     this should be expressed by a theorem of the form "basevars (x,y,z,...)".
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   232
   - Resolve this theorem with baseE to introduce a constant for the value of the
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   233
     variables in the successor state, and resolve the goal with the result.
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   234
   - Resolve with enabledI and do some rewriting.
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   235
   - Solve for the unknowns using standard HOL reasoning.
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   236
   The following tactic combines these steps except the final one.
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   237
*)
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   238
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   239
fun enabled_tac base_vars =
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   240
    clarsimp_tac (claset() addSIs [base_vars RS base_enabled], simpset());
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   241
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   242
(* Example:
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   243
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 14100
diff changeset
   244
val [prem] = goal (the_context ()) "basevars (x,y,z) ==> |- x --> Enabled ($x & (y$ = #False))";
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4477
diff changeset
   245
by (enabled_tac prem 1);
6301
08245f5a436d expandshort
paulson
parents: 6255
diff changeset
   246
by Auto_tac;
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   247
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   248
*)