src/Pure/thm.ML
changeset 9501 9cd32060bbc8
parent 9461 8645b0413366
child 9611 5188f23cdcc1
equal deleted inserted replaced
9500:e21a76142269 9501:9cd32060bbc8
    81     | Rename_params_rule  of string list * int;
    81     | Rename_params_rule  of string list * int;
    82   type deriv	(* = rule mtree *)
    82   type deriv	(* = rule mtree *)
    83 
    83 
    84   (*meta theorems*)
    84   (*meta theorems*)
    85   type thm
    85   type thm
    86   val rep_thm           : thm -> {sign: Sign.sg, der: deriv, maxidx: int,
    86   val rep_thm           : thm -> {sign: Sign.sg, der: bool * deriv, maxidx: int,
    87                                   shyps: sort list, hyps: term list, 
    87                                   shyps: sort list, hyps: term list, 
    88                                   prop: term}
    88                                   prop: term}
    89   val crep_thm          : thm -> {sign: Sign.sg, der: deriv, maxidx: int,
    89   val crep_thm          : thm -> {sign: Sign.sg, der: bool * deriv, maxidx: int,
    90                                   shyps: sort list, hyps: cterm list, 
    90                                   shyps: sort list, hyps: cterm list, 
    91                                   prop: cterm}
    91                                   prop: cterm}
    92   exception THM of string * int * thm list
    92   exception THM of string * int * thm list
    93   type 'a attribute 	(* = 'a * thm -> 'a * thm *)
    93   type 'a attribute 	(* = 'a * thm -> 'a * thm *)
    94   val eq_thm		: thm * thm -> bool
    94   val eq_thm		: thm * thm -> bool
   363 
   363 
   364 datatype deriv_kind = MinDeriv | ThmDeriv | FullDeriv;
   364 datatype deriv_kind = MinDeriv | ThmDeriv | FullDeriv;
   365 
   365 
   366 val keep_derivs = ref MinDeriv;
   366 val keep_derivs = ref MinDeriv;
   367 
   367 
       
   368 local
   368 
   369 
   369 (*Build a minimal derivation.  Keep oracles; suppress atomic inferences;
   370 (*Build a minimal derivation.  Keep oracles; suppress atomic inferences;
   370   retain Theorems or their underlying links; keep anything else*)
   371   retain Theorems or their underlying links; keep anything else*)
   371 fun squash_derivs [] = []
   372 fun squash_derivs [] = []
   372   | squash_derivs (der::ders) =
   373   | squash_derivs (der::ders) =
   379                                then der :: squash_derivs ders
   380                                then der :: squash_derivs ders
   380                                else squash_derivs ders
   381                                else squash_derivs ders
   381         | Join (_, [])      => squash_derivs ders
   382         | Join (_, [])      => squash_derivs ders
   382         | _                 => der :: squash_derivs ders);
   383         | _                 => der :: squash_derivs ders);
   383 
   384 
   384 
       
   385 (*Ensure sharing of the most likely derivation, the empty one!*)
   385 (*Ensure sharing of the most likely derivation, the empty one!*)
   386 val min_infer = Join (MinProof, []);
   386 val min_infer = Join (MinProof, []);
   387 
   387 
   388 (*Make a minimal inference*)
   388 (*Make a minimal inference*)
   389 fun make_min_infer []    = min_infer
   389 fun make_min_infer []    = min_infer
   390   | make_min_infer [der] = der
   390   | make_min_infer [der] = der
   391   | make_min_infer ders  = Join (MinProof, ders);
   391   | make_min_infer ders  = Join (MinProof, ders);
   392 
   392 
   393 fun infer_derivs (rl, [])   = Join (rl, [])
   393 fun is_oracle (Oracle _) = true
       
   394   | is_oracle _ = false;
       
   395 
       
   396 in
       
   397 
       
   398 fun infer_derivs (rl, []: (bool * deriv) list)   = (is_oracle rl, Join (rl, []))
   394   | infer_derivs (rl, ders) =
   399   | infer_derivs (rl, ders) =
   395     if !keep_derivs=FullDeriv then Join (rl, ders)
   400       (is_oracle rl orelse exists #1 ders,
   396     else make_min_infer (squash_derivs ders);
   401         if !keep_derivs=FullDeriv then Join (rl, map #2 ders)
       
   402         else make_min_infer (squash_derivs (map #2 ders)));
       
   403 
       
   404 end;
   397 
   405 
   398 
   406 
   399 
   407 
   400 (*** Meta theorems ***)
   408 (*** Meta theorems ***)
   401 
   409 
   402 datatype thm = Thm of
   410 datatype thm = Thm of
   403  {sign_ref: Sign.sg_ref,       (*mutable reference to signature*)
   411  {sign_ref: Sign.sg_ref,       (*mutable reference to signature*)
   404   der: deriv,                  (*derivation*)
   412   der: bool * deriv,           (*derivation*)
   405   maxidx: int,                 (*maximum index of any Var or TVar*)
   413   maxidx: int,                 (*maximum index of any Var or TVar*)
   406   shyps: sort list,            (*sort hypotheses*)
   414   shyps: sort list,            (*sort hypotheses*)
   407   hyps: term list,             (*hypotheses*)
   415   hyps: term list,             (*hypotheses*)
   408   prop: term};                 (*conclusion*)
   416   prop: term};                 (*conclusion*)
   409 
   417 
   606 
   614 
   607 
   615 
   608 (* name and tags -- make proof objects more readable *)
   616 (* name and tags -- make proof objects more readable *)
   609 
   617 
   610 fun get_name_tags (Thm {der, ...}) =
   618 fun get_name_tags (Thm {der, ...}) =
   611   (case der of
   619   (case #2 der of
   612     Join (Theorem x, _) => x
   620     Join (Theorem x, _) => x
   613   | Join (Axiom x, _) => x
   621   | Join (Axiom x, _) => x
   614   | _ => ("", []));
   622   | _ => ("", []));
   615 
   623 
   616 fun put_name_tags x (Thm {sign_ref, der, maxidx, shyps, hyps, prop}) =
   624 fun put_name_tags x (Thm {sign_ref, der = (ora, der), maxidx, shyps, hyps, prop}) =
   617   let
   625   let
   618     val der' =
   626     val der' =
   619       (case der of
   627       (case der of
   620         Join (Theorem _, ds) => Join (Theorem x, ds)
   628         Join (Theorem _, ds) => Join (Theorem x, ds)
   621       | Join (Axiom _, ds) => Join (Axiom x, ds)
   629       | Join (Axiom _, ds) => Join (Axiom x, ds)
   622       | _ => Join (Theorem x, [der]));
   630       | _ => Join (Theorem x, [der]));
   623   in
   631   in
   624     Thm {sign_ref = sign_ref, der = der', maxidx = maxidx,
   632     Thm {sign_ref = sign_ref, der = (ora, der'), maxidx = maxidx,
   625       shyps = shyps, hyps = hyps, prop = prop}
   633       shyps = shyps, hyps = hyps, prop = prop}
   626   end;
   634   end;
   627 
   635 
   628 val name_of_thm = #1 o get_name_tags;
   636 val name_of_thm = #1 o get_name_tags;
   629 val tags_of_thm = #2 o get_name_tags;
   637 val tags_of_thm = #2 o get_name_tags;
  2166           (case botc true skel0 mss trec of
  2174           (case botc true skel0 mss trec of
  2167              Some(trec1) => trec1 | None => trec)
  2175              Some(trec1) => trec1 | None => trec)
  2168 
  2176 
  2169     and subc skel
  2177     and subc skel
  2170              (mss as Mss{rules,congs,procs,bounds,prems,mk_rews,termless})
  2178              (mss as Mss{rules,congs,procs,bounds,prems,mk_rews,termless})
  2171              (trec as (t0:term,etc:sort list*term list * rule mtree list)) =
  2179              (trec as (t0:term,etc:sort list*term list * (bool * deriv) list)) =
  2172        (case t0 of
  2180        (case t0 of
  2173            Abs(a,T,t) =>
  2181            Abs(a,T,t) =>
  2174              let val b = variant bounds a
  2182              let val b = variant bounds a
  2175                  val v = Free("." ^ b,T)
  2183                  val v = Free("." ^ b,T)
  2176                  val mss' = mk_mss (rules, congs, procs, b :: bounds, prems, mk_rews, termless)
  2184                  val mss' = mk_mss (rules, congs, procs, b :: bounds, prems, mk_rews, termless)
  2351       in
  2359       in
  2352         if T <> propT then
  2360         if T <> propT then
  2353           raise THM ("Oracle's result must have type prop: " ^ name, 0, [])
  2361           raise THM ("Oracle's result must have type prop: " ^ name, 0, [])
  2354         else fix_shyps [] []
  2362         else fix_shyps [] []
  2355           (Thm {sign_ref = sign_ref', 
  2363           (Thm {sign_ref = sign_ref', 
  2356             der = Join (Oracle (name, sign, exn), []),
  2364             der = (true, Join (Oracle (name, sign, exn), [])),
  2357             maxidx = maxidx,
  2365             maxidx = maxidx,
  2358             shyps = [], 
  2366             shyps = [], 
  2359             hyps = [], 
  2367             hyps = [], 
  2360             prop = prop})
  2368             prop = prop})
  2361       end
  2369       end