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