src/HOL/TLA/Intensional.ML
author urbanc
Tue, 13 Dec 2005 18:11:21 +0100
changeset 18396 b3e7da94b51f
parent 17309 c43ed29bd197
child 19861 620d90091788
permissions -rw-r--r--
added a fresh_left lemma that contains all instantiation for the various atom-types.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
     1
(*
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
     2
    File:        Intensional.ML
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
     3
    ID:          $Id$
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
     4
    Author:      Stephan Merz
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
     5
    Copyright:   1998 University of Munich
3807
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 "intensional" logics.
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
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    10
val intensional_rews = [unl_con,unl_lift,unl_lift2,unl_lift3,unl_Rall,unl_Rex,unl_Rex1];
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    11
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    12
Goalw [Valid_def,unl_lift2] "|- x=y  ==>  (x==y)";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    13
by (rtac eq_reflection 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    14
by (rtac ext 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    15
by (etac spec 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    16
qed "inteq_reflection";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    17
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    18
val [prem] = goalw (the_context ()) [Valid_def] "(!!w. w |= A) ==> |- A";
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    19
by (REPEAT (resolve_tac [allI,prem] 1));
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    20
qed "intI";
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    21
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    22
Goalw [Valid_def] "|- A ==> w |= A";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    23
by (etac spec 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    24
qed "intD";
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    25
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    26
(** Lift usual HOL simplifications to "intensional" level. **)
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    27
local
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    28
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    29
fun prover s = (prove_goal (the_context ()) s
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    30
                 (fn _ => [rewrite_goals_tac (Valid_def::intensional_rews),
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    31
                           blast_tac HOL_cs 1])) RS inteq_reflection
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    32
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    33
in
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    34
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    35
val int_simps = map prover
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    36
 [ "|- (x=x) = #True",
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    37
   "|- (~#True) = #False", "|- (~#False) = #True", "|- (~~ P) = P",
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    38
   "|- ((~P) = P) = #False", "|- (P = (~P)) = #False",
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    39
   "|- (P ~= Q) = (P = (~Q))",
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    40
   "|- (#True=P) = P", "|- (P=#True) = P",
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    41
   "|- (#True --> P) = P", "|- (#False --> P) = #True",
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    42
   "|- (P --> #True) = #True", "|- (P --> P) = #True",
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    43
   "|- (P --> #False) = (~P)", "|- (P --> ~P) = (~P)",
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    44
   "|- (P & #True) = P", "|- (#True & P) = P",
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    45
   "|- (P & #False) = #False", "|- (#False & P) = #False",
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    46
   "|- (P & P) = P", "|- (P & ~P) = #False", "|- (~P & P) = #False",
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    47
   "|- (P | #True) = #True", "|- (#True | P) = #True",
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    48
   "|- (P | #False) = P", "|- (#False | P) = P",
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    49
   "|- (P | P) = P", "|- (P | ~P) = #True", "|- (~P | P) = #True",
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    50
   "|- (! x. P) = P", "|- (? x. P) = P",
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    51
   "|- (~Q --> ~P) = (P --> Q)",
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    52
   "|- (P|Q --> R) = ((P-->R)&(Q-->R))" ]
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    53
end;
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    54
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    55
Goal "|- #True";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    56
by (simp_tac (simpset() addsimps [Valid_def,unl_con]) 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
    57
qed "TrueW";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    58
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    59
Addsimps (TrueW::intensional_rews);
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    60
Addsimps int_simps;
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    61
AddSIs [intI];
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    62
AddDs  [intD];
3807
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
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    65
(* ======== Functions to "unlift" intensional implications into HOL rules ====== *)
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    66
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    67
(* Basic unlifting introduces a parameter "w" and applies basic rewrites, e.g.
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    68
   |- F = G    becomes   F w = G w
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    69
   |- F --> G  becomes   F w --> G w
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    70
*)
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    71
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    72
fun int_unlift th =
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    73
  rewrite_rule intensional_rews ((th RS intD) handle _ => th);
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    74
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    75
(* Turn  |- F = G  into meta-level rewrite rule  F == G *)
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    76
fun int_rewrite th =
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    77
    zero_var_indexes (rewrite_rule intensional_rews (th RS inteq_reflection));
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    78
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    79
(* flattening turns "-->" into "==>" and eliminates conjunctions in the
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    80
   antecedent. For example,
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    81
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    82
         P & Q --> (R | S --> T)    becomes   [| P; Q; R | S |] ==> T
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    83
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    84
   Flattening can be useful with "intensional" lemmas (after unlifting).
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    85
   Naive resolution with mp and conjI may run away because of higher-order
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    86
   unification, therefore the code is a little awkward.
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    87
*)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    88
fun flatten t =
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    89
  let
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    90
    (* analogous to RS, but using matching instead of resolution *)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    91
    fun matchres tha i thb =
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    92
      case Seq.chop (2, biresolution true [(false,tha)] i thb) of
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    93
          ([th],_) => th
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    94
        | ([],_)   => raise THM("matchres: no match", i, [tha,thb])
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
    95
        |      _   => raise THM("matchres: multiple unifiers", i, [tha,thb])
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    96
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    97
    (* match tha with some premise of thb *)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    98
    fun matchsome tha thb =
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    99
      let fun hmatch 0 = raise THM("matchsome: no match", 0, [tha,thb])
17309
c43ed29bd197 converted to Isar theory format;
wenzelm
parents: 9517
diff changeset
   100
            | hmatch n = (matchres tha n thb) handle _ => hmatch (n-1)
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   101
      in hmatch (nprems_of thb) end
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   102
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   103
    fun hflatten t =
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   104
        case (concl_of t) of
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   105
          Const _ $ (Const ("op -->", _) $ _ $ _) => hflatten (t RS mp)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   106
        | _ => (hflatten (matchsome conjI t)) handle _ => zero_var_indexes t
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   107
  in
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   108
    hflatten t
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   109
end;
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   110
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   111
fun int_use th =
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   112
    case (concl_of th) of
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   113
      Const _ $ (Const ("Intensional.Valid", _) $ _) =>
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   114
              ((flatten (int_unlift th)) handle _ => th)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   115
    | _ => th;
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   116
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   117
(* ========================================================================= *)
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   118
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
   119
Goalw [Valid_def] "|- (~(! x. F x)) = (? x. ~F x)";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
   120
by (Simp_tac 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
   121
qed "Not_Rall";
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   122
9517
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
   123
Goalw [Valid_def] "|- (~ (? x. F x)) = (! x. ~ F x)";
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
   124
by (Simp_tac 1);
f58863b1406a tuned version by Stephan Merz (unbatchified etc.);
wenzelm
parents: 6255
diff changeset
   125
qed "Not_Rex";