theory NamedThms
imports Main
begin
chapter {* Recipes *}
text_raw {* 
\section*{Accumulate a list of theorems under a name} 
*}
text {*
  \paragraph{Problem:} Your tool @{text foo} works with special rules, called @{text foo}-rules.
  Users should be able to declare @{text foo}-rules in the theory,
  which are then used by some method.
  \paragraph{Solution:}
  *}
ML {*
  structure FooRules = NamedThmsFun(
    val name = "foo" 
    val description = "Rules for foo"
  );
*}
setup FooRules.setup
text {*
  This declares a context data slot where the theorems are stored,
  an attribute @{attribute foo} (with the usual @{text add} and @{text del} options
  to declare new rules, and the internal ML interface to retrieve and 
  modify the facts.
  Furthermore, the facts are made available under the dynamic fact name
  @{text foo}:
*}
lemma rule1[foo]: "A" sorry
lemma rule2[foo]: "B" sorry
declare rule1[foo del]
thm foo
ML {* 
  FooRules.get @{context};
*}
text {* 
  \begin{readmore}
  For more information see @{ML_file "Pure/Tools/named_thms.ML"}.
  \end{readmore}
 *}
end