src/HOL/TLA/Intensional.ML
author wenzelm
Thu, 14 Oct 1999 15:04:36 +0200
changeset 7866 3ccaa11b6df9
parent 6255 db63752140c7
child 9517 f58863b1406a
permissions -rw-r--r--
pdf: generate thumbnails if ISABELLE_THUMBPDF set;
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
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    11
qed_goalw "inteq_reflection" Intensional.thy  [Valid_def,unl_lift2]
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    12
  "|- x=y  ==>  (x==y)"
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    13
  (fn [prem] => [rtac eq_reflection 1, rtac ext 1, rtac (prem RS spec) 1 ]);
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    14
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    15
qed_goalw "intI" Intensional.thy [Valid_def] "(!!w. w |= A) ==> |- A"
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    16
  (fn [prem] => [REPEAT (resolve_tac [allI,prem] 1)]);
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    17
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    18
qed_goalw "intD" Intensional.thy [Valid_def] "|- A ==> w |= A"
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    19
  (fn [prem] => [rtac (prem RS spec) 1]);
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    20
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    21
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    22
(** Lift usual HOL simplifications to "intensional" level. **)
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    23
local
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    24
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    25
fun prover s = (prove_goal Intensional.thy s 
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    26
                 (fn _ => [rewrite_goals_tac (Valid_def::intensional_rews), 
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    27
                           blast_tac HOL_cs 1])) RS inteq_reflection
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    28
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    29
in
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    30
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    31
val int_simps = map prover
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    32
 [ "|- (x=x) = #True",
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    33
   "|- (~#True) = #False", "|- (~#False) = #True", "|- (~~ P) = P",
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    34
   "|- ((~P) = P) = #False", "|- (P = (~P)) = #False", 
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    35
   "|- (P ~= Q) = (P = (~Q))",
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    36
   "|- (#True=P) = P", "|- (P=#True) = P",
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    37
   "|- (#True --> P) = P", "|- (#False --> P) = #True", 
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    38
   "|- (P --> #True) = #True", "|- (P --> P) = #True",
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    39
   "|- (P --> #False) = (~P)", "|- (P --> ~P) = (~P)",
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    40
   "|- (P & #True) = P", "|- (#True & P) = P", 
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    41
   "|- (P & #False) = #False", "|- (#False & P) = #False", 
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    42
   "|- (P & P) = P", "|- (P & ~P) = #False", "|- (~P & P) = #False",
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    43
   "|- (P | #True) = #True", "|- (#True | P) = #True", 
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    44
   "|- (P | #False) = P", "|- (#False | P) = P", 
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    45
   "|- (P | P) = P", "|- (P | ~P) = #True", "|- (~P | P) = #True",
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    46
   "|- (! x. P) = P", "|- (? x. P) = P", 
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    47
   "|- (~Q --> ~P) = (P --> Q)",
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    48
   "|- (P|Q --> R) = ((P-->R)&(Q-->R))" ];
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    49
end;
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    50
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    51
qed_goal "TrueW" Intensional.thy "|- #True"
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    52
  (fn _ => [simp_tac (simpset() addsimps [Valid_def,unl_con]) 1]);
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    53
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    54
Addsimps (TrueW::intensional_rews);
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    55
Addsimps int_simps;
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    56
AddSIs [intI];
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    57
AddDs  [intD];
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    58
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    59
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    60
(* ======== Functions to "unlift" intensional implications into HOL rules ====== *)
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    61
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    62
(* Basic unlifting introduces a parameter "w" and applies basic rewrites, e.g.
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    63
   |- F = G    becomes   F w = G w
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    64
   |- F --> G  becomes   F w --> G w
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
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    67
fun int_unlift th =
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    68
  rewrite_rule intensional_rews ((th RS intD) handle _ => th);
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    69
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    70
(* Turn  |- F = G  into meta-level rewrite rule  F == G *)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    71
fun int_rewrite th = 
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    72
    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
    73
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    74
(* flattening turns "-->" into "==>" and eliminates conjunctions in the
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    75
   antecedent. For example,
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    76
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    77
         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
    78
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    79
   Flattening can be useful with "intensional" lemmas (after unlifting).
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    80
   Naive resolution with mp and conjI may run away because of higher-order
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    81
   unification, therefore the code is a little awkward.
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    82
*)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    83
fun flatten t =
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    84
  let 
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    85
    (* analogous to RS, but using matching instead of resolution *)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    86
    fun matchres tha i thb =
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    87
      case Seq.chop (2, biresolution true [(false,tha)] i thb) of
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    88
	  ([th],_) => th
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    89
	| ([],_)   => raise THM("matchres: no match", i, [tha,thb])
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    90
	|      _   => raise THM("matchres: multiple unifiers", i, [tha,thb])
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    91
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    92
    (* match tha with some premise of thb *)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    93
    fun matchsome tha thb =
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    94
      let fun hmatch 0 = raise THM("matchsome: no match", 0, [tha,thb])
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    95
	    | hmatch n = (matchres tha n thb) handle _ => hmatch (n-1)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    96
      in hmatch (nprems_of thb) end
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
    97
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    98
    fun hflatten t =
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
    99
        case (concl_of t) of
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   100
          Const _ $ (Const ("op -->", _) $ _ $ _) => hflatten (t RS mp)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   101
        | _ => (hflatten (matchsome conjI t)) handle _ => zero_var_indexes t
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   102
  in
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   103
    hflatten t
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   104
end;
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   105
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   106
fun int_use th =
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   107
    case (concl_of th) of
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   108
      Const _ $ (Const ("Intensional.Valid", _) $ _) =>
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   109
              ((flatten (int_unlift th)) handle _ => th)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   110
    | _ => th;
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   111
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   112
(***
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   113
(* Make the simplifier accept "intensional" goals by either turning them into
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   114
   a meta-equality or by unlifting them.
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   115
*)
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   116
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   117
let 
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   118
  val ss = simpset_ref()
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   119
  fun try_rewrite th = (int_rewrite th) handle _ => (int_use th) handle _ => th
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   120
in 
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   121
  ss := !ss setmksimps ((mksimps mksimps_pairs) o try_rewrite)
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   122
end;
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   123
***)
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
(* ========================================================================= *)
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   126
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   127
qed_goal "Not_Rall" Intensional.thy
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   128
   "|- (~(! x. F x)) = (? x. ~F x)"
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   129
   (fn _ => [simp_tac (simpset() addsimps [Valid_def]) 1]);
3807
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   130
6255
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   131
qed_goal "Not_Rex" Intensional.thy
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   132
   "|- (~ (? x. F x)) = (! x. ~ F x)"
db63752140c7 updated (Stephan Merz);
wenzelm
parents: 4089
diff changeset
   133
   (fn _ => [simp_tac (simpset() addsimps [Valid_def]) 1]);
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
(* IntLemmas.ML contains a collection of further lemmas about "intensional" logic.
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   136
   These are not loaded by default because they are not required for the
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   137
   standard proof procedures that first unlift proof goals to the HOL level.
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   138
82a99b090d9d A formalization of TLA in HOL -- by Stephan Merz;
wenzelm
parents:
diff changeset
   139
use "IntLemmas.ML";
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
*)