src/ZF/Tools/ind_cases.ML
author wenzelm
Tue, 13 Nov 2001 22:20:15 +0100
changeset 12174 a0aab0b9f2e9
child 12311 ce5f9e61c037
permissions -rw-r--r--
Generic inductive cases facility for (co)inductive definitions.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12174
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
     1
(*  Title:      ZF/Tools/ind_cases.ML
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, LMU Muenchen
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
     4
    License:    GPL (GNU GENERAL PUBLIC LICENSE)
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
     5
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
     6
Generic inductive cases facility for (co)inductive definitions.
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
     7
*)
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
     8
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
     9
signature IND_CASES =
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    10
sig
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    11
  val declare: string -> (simpset -> cterm -> thm) -> theory -> theory
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    12
  val inductive_cases: ((bstring * Args.src list) * string list) -> theory -> theory
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    13
  val setup: (theory -> theory) list
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    14
end;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    15
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    16
structure IndCases: IND_CASES =
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    17
struct
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    18
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    19
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    20
(* theory data *)
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    21
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    22
structure IndCasesArgs =
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    23
struct
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    24
  val name = "ZF/ind_cases";
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    25
  type T = (simpset -> cterm -> thm) Symtab.table;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    26
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    27
  val empty = Symtab.empty;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    28
  val copy = I;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    29
  val finish = I;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    30
  val prep_ext = I;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    31
  fun merge (tab1, tab2) = Symtab.merge (K true) (tab1, tab2);
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    32
  fun print _ _ = ();
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    33
end;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    34
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    35
structure IndCasesData = TheoryDataFun(IndCasesArgs);
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    36
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    37
fun declare name f = IndCasesData.map (fn tab => Symtab.update ((name, f), tab));
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    38
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    39
fun smart_cases thy ss read_prop s =
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    40
  let
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    41
    fun err () = error ("Malformed set membership statement: " ^ s);
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    42
    val A = read_prop s handle ERROR => err ();
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    43
    val c = #1 (Term.dest_Const (Term.head_of (#2 (Ind_Syntax.dest_mem (FOLogic.dest_Trueprop
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    44
      (Logic.strip_imp_concl A)))))) handle TERM _ => err ();
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    45
  in
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    46
    (case Symtab.lookup (IndCasesData.get thy, c) of
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    47
      None => error ("Unknown inductive cases rule for set " ^ quote c)
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    48
    | Some f => f ss (Thm.cterm_of (Theory.sign_of thy) A))
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    49
  end;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    50
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    51
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    52
(* inductive_cases command *)
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    53
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    54
fun inductive_cases ((name, srcs), props) thy =
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    55
  let
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    56
    val read_prop = ProofContext.read_prop (ProofContext.init thy);
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    57
    val ths = map (smart_cases thy (Simplifier.simpset_of thy) read_prop) props;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    58
    val atts = map (Attrib.global_attribute thy) srcs;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    59
  in
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    60
    thy |> IsarThy.have_theorems_i Drule.lemmaK
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    61
      [(((name, atts), map Thm.no_attributes ths), Comment.none)]
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    62
  end;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    63
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    64
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    65
(* ind_cases method *)
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    66
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    67
fun mk_cases_meth (ctxt, props) =
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    68
  props
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    69
  |> map (smart_cases (ProofContext.theory_of ctxt) (Simplifier.get_local_simpset ctxt)
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    70
    (ProofContext.read_prop ctxt))
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    71
  |> Method.erule 0;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    72
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    73
val mk_cases_args = Method.syntax (Scan.lift (Scan.repeat1 Args.name));
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    74
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    75
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    76
(* package setup *)
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    77
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    78
val setup =
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    79
 [IndCasesData.init,
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    80
  Method.add_methods [("ind_cases", mk_cases_meth oo mk_cases_args,
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    81
    "dynamic case analysis on sets")]];
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    82
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    83
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    84
(* outer syntax *)
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    85
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    86
local structure P = OuterParse and K = OuterSyntax.Keyword in
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    87
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    88
val ind_cases =
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    89
  P.opt_thm_name ":" -- Scan.repeat1 P.prop --| P.marg_comment
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    90
  >> (Toplevel.theory o inductive_cases);
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    91
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    92
val inductive_casesP =
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    93
  OuterSyntax.command "inductive_cases"
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    94
    "create simplified instances of elimination rules (improper)" K.thy_script ind_cases;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    95
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    96
val _ = OuterSyntax.add_parsers [inductive_casesP];
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    97
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    98
end;
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
    99
a0aab0b9f2e9 Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff changeset
   100
end;