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