src/Pure/ML/ml_thms.ML
author wenzelm
Sat, 28 Jun 2008 22:52:07 +0200
changeset 27389 823c7ec3ea4f
child 27521 44081396d735
permissions -rw-r--r--
Isar theorem values within ML.
wenzelm@27389
     1
(*  Title:      Pure/ML/ml_thms.ML
wenzelm@27389
     2
    ID:         $Id$
wenzelm@27389
     3
    Author:     Makarius
wenzelm@27389
     4
wenzelm@27389
     5
Isar theorem values within ML.
wenzelm@27389
     6
*)
wenzelm@27389
     7
wenzelm@27389
     8
signature ML_THMS =
wenzelm@27389
     9
sig
wenzelm@27389
    10
  val the_thms: Proof.context -> int -> thm list
wenzelm@27389
    11
  val the_thm: Proof.context -> int -> thm
wenzelm@27389
    12
end;
wenzelm@27389
    13
wenzelm@27389
    14
structure ML_Thms: ML_THMS =
wenzelm@27389
    15
struct
wenzelm@27389
    16
wenzelm@27389
    17
(* auxiliary facts table *)
wenzelm@27389
    18
wenzelm@27389
    19
structure AuxFacts = ProofDataFun
wenzelm@27389
    20
(
wenzelm@27389
    21
  type T = thm list Inttab.table;
wenzelm@27389
    22
  fun init _ = Inttab.empty;
wenzelm@27389
    23
);
wenzelm@27389
    24
wenzelm@27389
    25
val put_thms = AuxFacts.map o Inttab.update;
wenzelm@27389
    26
wenzelm@27389
    27
fun the_thms ctxt name = the (Inttab.lookup (AuxFacts.get ctxt) name);
wenzelm@27389
    28
fun the_thm ctxt name = the_single (the_thms ctxt name);
wenzelm@27389
    29
wenzelm@27389
    30
fun thm_bind kind a i =
wenzelm@27389
    31
  "val " ^ a ^ " = ML_Thms.the_" ^ kind ^
wenzelm@27389
    32
    " (ML_Context.the_local_context ()) " ^ string_of_int i ^ ";\n";
wenzelm@27389
    33
wenzelm@27389
    34
wenzelm@27389
    35
(* fact references *)
wenzelm@27389
    36
wenzelm@27389
    37
fun thm_antiq kind scan = ML_Context.add_antiq kind
wenzelm@27389
    38
  (scan >> (fn ths => fn {struct_name, background} =>
wenzelm@27389
    39
    let
wenzelm@27389
    40
      val i = serial ();
wenzelm@27389
    41
      val (a, background') = background
wenzelm@27389
    42
        |> ML_Antiquote.variant kind ||> put_thms (i, ths);
wenzelm@27389
    43
      val ml = (thm_bind kind a i, struct_name ^ "." ^ a);
wenzelm@27389
    44
    in (K ml, background') end));
wenzelm@27389
    45
wenzelm@27389
    46
val _ = thm_antiq "thm" (Attrib.thm >> single);
wenzelm@27389
    47
val _ = thm_antiq "thms" Attrib.thms;
wenzelm@27389
    48
wenzelm@27389
    49
wenzelm@27389
    50
(* ad-hoc goals *)
wenzelm@27389
    51
wenzelm@27389
    52
fun by x = Scan.lift (Args.$$$ "by") x;
wenzelm@27389
    53
val goal = Scan.unless by Args.prop;
wenzelm@27389
    54
wenzelm@27389
    55
val _ = ML_Context.add_antiq "lemma"
wenzelm@27389
    56
  ((Args.context -- Scan.repeat1 goal -- (by |-- Scan.lift Method.parse_args)) >>
wenzelm@27389
    57
    (fn ((ctxt, props), method_text) => fn {struct_name, background} =>
wenzelm@27389
    58
      let
wenzelm@27389
    59
        val i = serial ();
wenzelm@27389
    60
        fun after_qed [res] goal_ctxt =
wenzelm@27389
    61
          put_thms (i, map Goal.norm_result (ProofContext.export goal_ctxt ctxt res)) goal_ctxt;
wenzelm@27389
    62
        val ctxt' = ctxt
wenzelm@27389
    63
          |> Proof.theorem_i NONE after_qed [map (rpair []) props]
wenzelm@27389
    64
          |> Proof.global_terminal_proof (method_text, NONE);
wenzelm@27389
    65
        val (a, background') = background
wenzelm@27389
    66
          |> ML_Antiquote.variant "lemma" ||> put_thms (i, the_thms ctxt' i);
wenzelm@27389
    67
        val ml = (thm_bind (if length props = 1 then "thm" else "thms") a i, struct_name ^ "." ^ a);
wenzelm@27389
    68
      in (K ml, background') end));
wenzelm@27389
    69
wenzelm@27389
    70
end;
wenzelm@27389
    71