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