ind_syntax.ML
author lcp
Thu, 25 Aug 1994 11:01:45 +0200
changeset 128 89669c58e506
child 134 4b7da5a895e7
permissions -rw-r--r--
INSTALLATION OF INDUCTIVE DEFINITIONS HOL/Sexp, List, LList: updated for inductive defs; streamlined proofs HOL/List, Subst/UTerm, ex/Simult, ex/Term: updated refs to Sexp intr rules HOL/Univ/diag_eqI: new HOL/intr_elim: now checks that the inductive name does not clash with existing theory names HOL/Sum: now type + is an infixr, to agree with type * HOL/Set: added Pow and the derived rules PowI, PowD, Pow_bottom, Pow_top HOL/Fun/set_cs: now includes Pow rules HOL/mono/Pow_mono: new HOL/Makefile: now has Inductive.thy,.ML and ex/Acc.thy,.ML HOL/Sexp,List,LList,ex/Term: converted as follows node *set -> item Sexp -> sexp LList_corec -> <self> LList_ -> llist_ LList\> -> llist List_case -> <self> List_rec -> <self> List_ -> list_ List\> -> list Term_rec -> <self> Term_ -> term_ Term\> -> term
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
     1
(*  Title: 	HOL/ind_syntax.ML
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
     2
    ID:         $Id$
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
     3
    Author: 	Lawrence C Paulson, Cambridge University Computer Laboratory
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
     4
    Copyright   1994  University of Cambridge
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
     5
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
     6
Abstract Syntax functions for Inductive Definitions
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
     7
See also ../Pure/section-utils.ML
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
     8
*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
     9
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    10
(*The structure protects these items from redeclaration (somewhat!).  The 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    11
  datatype definitions in theory files refer to these items by name!
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    12
*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    13
structure Ind_Syntax =
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    14
struct
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    15
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    16
(** Abstract syntax definitions for HOL **)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    17
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    18
val termC: class = "term";
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    19
val termS: sort = [termC];
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    20
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    21
val termTVar = TVar(("'a",0),termS);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    22
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    23
val boolT = Type("bool",[]);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    24
val unitT = Type("unit",[]);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    25
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    26
val conj = Const("op &", [boolT,boolT]--->boolT)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    27
and disj = Const("op |", [boolT,boolT]--->boolT)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    28
and imp = Const("op -->", [boolT,boolT]--->boolT);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    29
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    30
fun eq_const T = Const("op =", [T,T]--->boolT);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    31
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    32
fun mk_set T = Type("set",[T]);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    33
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    34
fun dest_set (Type("set",[T])) = T
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    35
  | dest_set _                 = error "dest_set: set type expected"
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    36
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    37
fun mk_mem (x,A) = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    38
  let val setT = fastype_of A
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    39
  in  Const("op :", [dest_set setT, setT]--->boolT) $ x $ A
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    40
  end;
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    41
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    42
fun Int_const T = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    43
  let val sT = mk_set T
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    44
  in  Const("op Int", [sT,sT]--->sT)  end;
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    45
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    46
fun exists_const T = Const("Ex", [T-->boolT]--->boolT);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    47
fun mk_exists (Free(x,T),P) = exists_const T $ (absfree (x,T,P));
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    48
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    49
fun all_const T = Const("All", [T-->boolT]--->boolT);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    50
fun mk_all (Free(x,T),P) = all_const T $ (absfree (x,T,P));
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    51
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    52
(*Creates All(%v.v:A --> P(v)) rather than Ball(A,P) *)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    53
fun mk_all_imp (A,P) = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    54
  let val T = dest_set (fastype_of A)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    55
  in  all_const T $ Abs("v", T, imp $ (mk_mem (Bound 0, A)) $ (P $ Bound 0))
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    56
  end;
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    57
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    58
(** Cartesian product type **)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    59
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    60
fun mk_prod (T1,T2) = Type("*", [T1,T2]);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    61
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    62
fun factors (Type("*", [T1,T2])) = factors T1 @ factors T2
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    63
  | factors T                    = [T];
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    64
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    65
(*Make a correctly typed ordered pair*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    66
fun mk_Pair (t1,t2) = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    67
  let val T1 = fastype_of t1
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    68
      and T2 = fastype_of t2
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    69
  in  Const("Pair", [T1, T2] ---> mk_prod(T1,T2)) $ t1 $ t2  end;
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    70
   
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    71
fun split_const(Ta,Tb,Tc) = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    72
    Const("split", [[Ta,Tb]--->Tc, mk_prod(Ta,Tb)] ---> Tc);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    73
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    74
(*Given u expecting arguments of types [T1,...,Tn], create term of 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    75
  type T1*...*Tn => Tc using split.  Here * associates to the LEFT*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    76
fun ap_split_l Tc u [ ]   = Abs("null", unitT, u)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    77
  | ap_split_l Tc u [_]   = u
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    78
  | ap_split_l Tc u (Ta::Tb::Ts) = ap_split_l Tc (split_const(Ta,Tb,Tc) $ u) 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    79
                                              (mk_prod(Ta,Tb) :: Ts);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    80
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    81
(*Given u expecting arguments of types [T1,...,Tn], create term of 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    82
  type T1*...*Tn => i using split.  Here * associates to the RIGHT*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    83
fun ap_split Tc u [ ]   = Abs("null", unitT, u)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    84
  | ap_split Tc u [_]   = u
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    85
  | ap_split Tc u [Ta,Tb] = split_const(Ta,Tb,Tc) $ u
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    86
  | ap_split Tc u (Ta::Ts) = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    87
      split_const(Ta, foldr1 mk_prod Ts, Tc) $ 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    88
      (Abs("v", Ta, ap_split Tc (u $ Bound(length Ts - 2)) Ts));
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    89
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    90
(** Disjoint sum type **)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    91
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    92
fun mk_sum (T1,T2) = Type("+", [T1,T2]);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    93
val Inl	= Const("Inl", dummyT)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    94
and Inr	= Const("Inr", dummyT);		(*correct types added later!*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    95
(*val elim	= Const("case", [iT-->iT, iT-->iT, iT]--->iT)*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    96
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    97
fun summands (Type("+", [T1,T2])) = summands T1 @ summands T2
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    98
  | summands T                    = [T];
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
    99
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   100
(*Given the destination type, fills in correct types of an Inl/Inr nest*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   101
fun mend_sum_types (h,T) =
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   102
    (case (h,T) of
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   103
	 (Const("Inl",_) $ h1, Type("+", [T1,T2])) =>
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   104
	     Const("Inl", T1 --> T) $ (mend_sum_types (h1, T1))
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   105
       | (Const("Inr",_) $ h2, Type("+", [T1,T2])) =>
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   106
	     Const("Inr", T2 --> T) $ (mend_sum_types (h2, T2))
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   107
       | _ => h);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   108
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   109
fun Collect_const T = Const("Collect", [T-->boolT] ---> mk_set T);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   110
fun mk_Collect (a,T,t) = Collect_const T $ absfree(a, T, t);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   111
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   112
val Trueprop = Const("Trueprop",boolT-->propT);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   113
fun mk_tprop P = Trueprop $ P;
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   114
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   115
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   116
(*simple error-checking in the premises of an inductive definition*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   117
fun chk_prem rec_hd (Const("op &",_) $ _ $ _) =
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   118
	error"Premises may not be conjuctive"
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   119
  | chk_prem rec_hd (Const("op :",_) $ t $ X) = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   120
	deny (Logic.occs(rec_hd,t)) "Recursion term on left of member symbol"
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   121
  | chk_prem rec_hd t = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   122
	deny (Logic.occs(rec_hd,t)) "Recursion term in side formula";
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   123
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   124
(*Return the conclusion of a rule, of the form t:X*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   125
fun rule_concl rl = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   126
    let val Const("Trueprop",_) $ (Const("op :",_) $ t $ X) = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   127
		Logic.strip_imp_concl rl
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   128
    in  (t,X)  end;
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   129
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   130
(*As above, but return error message if bad*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   131
fun rule_concl_msg sign rl = rule_concl rl
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   132
    handle Bind => error ("Ill-formed conclusion of introduction rule: " ^ 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   133
			  Sign.string_of_term sign rl);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   134
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   135
(*For simplifying the elimination rule*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   136
val sumprod_free_SEs = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   137
    Pair_inject ::
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   138
    map make_elim [Inl_neq_Inr, Inr_neq_Inl, Inl_inject, Inr_inject];
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   139
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   140
(*For deriving cases rules.  
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   141
  read_instantiate replaces a propositional variable by a formula variable*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   142
val equals_CollectD = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   143
    read_instantiate [("W","?Q")]
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   144
        (make_elim (equalityD1 RS subsetD RS CollectD));
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   145
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   146
(*Delete needless equality assumptions*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   147
val refl_thin = prove_goal HOL.thy "!!P. [| a=a;  P |] ==> P"
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   148
     (fn _ => [assume_tac 1]);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   149
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   150
end;
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents:
diff changeset
   151