src/HOL/Tools/Function/fun_cases.ML
author haftmann
Tue, 13 Oct 2015 09:21:15 +0200
changeset 61424 c3658c18b7bc
parent 59936 b8ffc3dc9e24
child 63064 2f18172214c8
permissions -rw-r--r--
prod_case as canonical name for product type eliminator
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
53603
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
     1
(*  Title:      HOL/Tools/Function/fun_cases.ML
53609
0f472e7063af tuned headers
krauss
parents: 53603
diff changeset
     2
    Author:     Manuel Eberl, TU Muenchen
53603
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
     3
53993
28fefe1d6749 tuned signature;
wenzelm
parents: 53992
diff changeset
     4
The fun_cases command for generating specialised elimination rules for
28fefe1d6749 tuned signature;
wenzelm
parents: 53992
diff changeset
     5
function package functions.
53603
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
     6
*)
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
     7
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
     8
signature FUN_CASES =
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
     9
sig
53993
28fefe1d6749 tuned signature;
wenzelm
parents: 53992
diff changeset
    10
  val mk_fun_cases: Proof.context -> term -> thm
28fefe1d6749 tuned signature;
wenzelm
parents: 53992
diff changeset
    11
  val fun_cases: (Attrib.binding * term list) list -> local_theory ->
53995
1d457fc83f5c tuned signature;
wenzelm
parents: 53994
diff changeset
    12
    (string * thm list) list * local_theory
53993
28fefe1d6749 tuned signature;
wenzelm
parents: 53992
diff changeset
    13
  val fun_cases_cmd: (Attrib.binding * string list) list -> local_theory ->
53995
1d457fc83f5c tuned signature;
wenzelm
parents: 53994
diff changeset
    14
    (string * thm list) list * local_theory
53603
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
    15
end;
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
    16
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
    17
structure Fun_Cases : FUN_CASES =
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
    18
struct
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
    19
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
    20
fun mk_fun_cases ctxt prop =
53992
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    21
  let
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    22
    fun err () =
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    23
      error (Pretty.string_of (Pretty.block
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    24
        [Pretty.str "Proposition is not a function equation:",
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    25
         Pretty.fbrk, Syntax.pretty_term ctxt prop]));
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    26
    val ((f, _), _) =
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    27
      Function_Elims.dest_funprop (HOLogic.dest_Trueprop prop)
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    28
        handle TERM _ => err ();
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    29
    val info = Function.get_info ctxt f handle List.Empty => err ();
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    30
    val {elims, pelims, is_partial, ...} = info;
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    31
    val elims = if is_partial then pelims else the elims;
59621
291934bac95e Thm.cterm_of and Thm.ctyp_of operate on local context;
wenzelm
parents: 59618
diff changeset
    32
    val cprop = Thm.cterm_of ctxt prop;
53992
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    33
    fun mk_elim rl =
53994
4237859c186d eliminated clone of Inductive.mk_cases_tac;
wenzelm
parents: 53993
diff changeset
    34
      Thm.implies_intr cprop
4237859c186d eliminated clone of Inductive.mk_cases_tac;
wenzelm
parents: 53993
diff changeset
    35
        (Tactic.rule_by_tactic ctxt (Inductive.mk_cases_tac ctxt) (Thm.assume cprop RS rl))
53992
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    36
      |> singleton (Variable.export (Variable.auto_fixes prop ctxt) ctxt);
53603
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
    37
  in
53992
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    38
    (case get_first (try mk_elim) (flat elims) of
53603
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
    39
      SOME r => r
53992
8b70dba5572f tuned whitespace;
wenzelm
parents: 53991
diff changeset
    40
    | NONE => err ())
53603
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
    41
  end;
53666
52a0a526e677 tuned white space;
wenzelm
parents: 53610
diff changeset
    42
53991
d8f7f3d998de provide regular ML interface and use plain Syntax.read_prop/Syntax.check_prop (update by Manuel Eberl);
wenzelm
parents: 53670
diff changeset
    43
fun gen_fun_cases prep_att prep_prop args lthy =
53667
0aefb31e27e0 distinguish Proof.context vs. local_theory semantically, with corresponding naming conventions;
wenzelm
parents: 53666
diff changeset
    44
  let
53991
d8f7f3d998de provide regular ML interface and use plain Syntax.read_prop/Syntax.check_prop (update by Manuel Eberl);
wenzelm
parents: 53670
diff changeset
    45
    val thmss =
d8f7f3d998de provide regular ML interface and use plain Syntax.read_prop/Syntax.check_prop (update by Manuel Eberl);
wenzelm
parents: 53670
diff changeset
    46
      map snd args
58993
302104d8366b prefer independent parallel map where user input is processed -- avoid non-deterministic feedback in error situations;
wenzelm
parents: 55997
diff changeset
    47
      |> burrow (grouped 10 Par_List.map_independent (mk_fun_cases lthy o prep_prop lthy));
53991
d8f7f3d998de provide regular ML interface and use plain Syntax.read_prop/Syntax.check_prop (update by Manuel Eberl);
wenzelm
parents: 53670
diff changeset
    48
    val facts =
55997
9dc5ce83202c modernized Attrib.check_name/check_src similar to methods (see also a989bdaf8121);
wenzelm
parents: 53995
diff changeset
    49
      map2 (fn ((a, atts), _) => fn thms => ((a, map (prep_att lthy) atts), [(thms, [])]))
53991
d8f7f3d998de provide regular ML interface and use plain Syntax.read_prop/Syntax.check_prop (update by Manuel Eberl);
wenzelm
parents: 53670
diff changeset
    50
        args thmss;
53995
1d457fc83f5c tuned signature;
wenzelm
parents: 53994
diff changeset
    51
  in lthy |> Local_Theory.notes facts end;
53670
5ccee1cb245a tuned signature;
wenzelm
parents: 53668
diff changeset
    52
53993
28fefe1d6749 tuned signature;
wenzelm
parents: 53992
diff changeset
    53
val fun_cases = gen_fun_cases (K I) Syntax.check_prop;
55997
9dc5ce83202c modernized Attrib.check_name/check_src similar to methods (see also a989bdaf8121);
wenzelm
parents: 53995
diff changeset
    54
val fun_cases_cmd = gen_fun_cases Attrib.check_src Syntax.read_prop;
53667
0aefb31e27e0 distinguish Proof.context vs. local_theory semantically, with corresponding naming conventions;
wenzelm
parents: 53666
diff changeset
    55
53603
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
    56
val _ =
59936
b8ffc3dc9e24 @{command_spec} is superseded by @{command_keyword};
wenzelm
parents: 59621
diff changeset
    57
  Outer_Syntax.local_theory @{command_keyword fun_cases}
53995
1d457fc83f5c tuned signature;
wenzelm
parents: 53994
diff changeset
    58
    "create simplified instances of elimination rules for function equations"
53993
28fefe1d6749 tuned signature;
wenzelm
parents: 53992
diff changeset
    59
    (Parse.and_list1 Parse_Spec.specs >> (snd oo fun_cases_cmd));
53666
52a0a526e677 tuned white space;
wenzelm
parents: 53610
diff changeset
    60
53603
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
    61
end;
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents:
diff changeset
    62