src/Pure/Isar/rule_cases.ML
author wenzelm
Thu, 29 Nov 2001 01:51:06 +0100
changeset 12325 4966dae8fa62
parent 12166 5fc22b8c03e9
child 12761 b0c39f9837af
permissions -rw-r--r--
RuleContext.intro_query_local;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Isar/rule_cases.ML
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
8807
wenzelm
parents: 8636
diff changeset
     4
    License:    GPL (GNU GENERAL PUBLIC LICENSE)
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
     5
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
     6
Manage local contexts of rules.
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
     7
*)
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
     8
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
     9
signature RULE_CASES =
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    10
sig
10530
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    11
  val consumes: int -> 'a attribute
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    12
  val consumes_default: int -> 'a attribute
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    13
  val name: string list -> thm -> thm
8427
wenzelm
parents: 8400
diff changeset
    14
  val case_names: string list -> 'a attribute
10530
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    15
  val get: thm -> string list * int
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    16
  val add: thm -> thm * (string list * int)
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    17
  val save: thm -> thm -> thm
10811
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    18
  type T
12166
5fc22b8c03e9 added empty;
wenzelm
parents: 11993
diff changeset
    19
  val empty: T
9290
be5924604010 make: opaq flag;
wenzelm
parents: 8807
diff changeset
    20
  val make: bool -> thm -> string list -> (string * T) list
8427
wenzelm
parents: 8400
diff changeset
    21
  val rename_params: string list list -> thm -> thm
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    22
  val params: string list list -> 'a attribute
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    23
end;
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    24
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    25
structure RuleCases: RULE_CASES =
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    26
struct
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    27
10811
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    28
(* names *)
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    29
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    30
val consumes_tagN = "consumes";
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    31
val cases_tagN = "cases";
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    32
val case_conclN = "case";
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    33
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    34
10530
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    35
(* number of consumed facts *)
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    36
10811
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    37
fun lookup_consumes thm = Library.assoc (Thm.tags_of_thm thm, consumes_tagN);
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    38
10530
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    39
fun get_consumes thm =
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    40
  let fun err () = raise THM ("Malformed 'consumes' tag of theorem", 0, [thm]) in
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    41
    (case lookup_consumes thm of
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    42
      None => 0
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    43
    | Some [s] => (case Syntax.read_nat s of Some n => n | _ => err ())
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    44
    | _ => err ())
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    45
  end;
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    46
11993
d20e653fc64f put_consumes: really overwrite existing tag;
wenzelm
parents: 11983
diff changeset
    47
fun put_consumes n =
d20e653fc64f put_consumes: really overwrite existing tag;
wenzelm
parents: 11983
diff changeset
    48
  Drule.tag_rule (consumes_tagN, [Library.string_of_int n]) o Drule.untag_rule consumes_tagN;
10530
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    49
val save_consumes = put_consumes o get_consumes;
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    50
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    51
fun consumes n x = Drule.rule_attribute (K (put_consumes n)) x;
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    52
fun consumes_default n x = if Library.is_some (lookup_consumes (#2 x)) then x else consumes n x;
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    53
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    54
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    55
(* case names *)
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    56
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    57
fun name names thm =
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    58
  thm
10811
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    59
  |> Drule.untag_rule cases_tagN
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    60
  |> Drule.tag_rule (cases_tagN, names);
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    61
10811
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    62
fun get_case_names thm = Library.assocs (Thm.tags_of_thm thm) cases_tagN;
10530
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    63
val save_case_names = name o get_case_names;
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    64
8427
wenzelm
parents: 8400
diff changeset
    65
fun case_names ss = Drule.rule_attribute (K (name ss));
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    66
10530
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    67
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    68
(* access hints *)
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    69
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    70
fun get thm = (get_case_names thm, get_consumes thm);
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    71
fun add thm = (thm, get thm);
10530
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    72
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    73
fun save thm = save_case_names thm o save_consumes thm;
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    74
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    75
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    76
(* prepare cases *)
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    77
10811
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    78
type T = {fixes: (string * typ) list, assumes: term list, binds: (indexname * term option) list};
10530
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
    79
12166
5fc22b8c03e9 added empty;
wenzelm
parents: 11993
diff changeset
    80
val empty = {fixes = [], assumes = [], binds = []};
5fc22b8c03e9 added empty;
wenzelm
parents: 11993
diff changeset
    81
11983
85141af30120 removed obsolete make_raw;
wenzelm
parents: 11764
diff changeset
    82
fun prep_case open_parms thm name i =
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    83
  let
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    84
    val (_, _, Bi, _) = Thm.dest_state (thm, i)
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    85
      handle THM _ => raise THM ("More cases than premises in rule", 0, [thm]);
10830
d19f9f4c35ee avoid renaming of params in cases;
wenzelm
parents: 10819
diff changeset
    86
    val xs = map (if open_parms then I else apfst Syntax.internal) (Logic.strip_params Bi);
10811
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    87
    val asms = map (curry Term.list_abs xs) (Logic.strip_assums_hyp Bi);
10872
87bb4462c434 make_raw: do not AutoBind.drop_judgment;
wenzelm
parents: 10830
diff changeset
    88
    val concl = Term.list_abs (xs, Logic.strip_assums_concl Bi);
11983
85141af30120 removed obsolete make_raw;
wenzelm
parents: 11764
diff changeset
    89
    val bind = ((case_conclN, 0), Some (ObjectLogic.drop_judgment (Thm.sign_of_thm thm) concl));
10872
87bb4462c434 make_raw: do not AutoBind.drop_judgment;
wenzelm
parents: 10830
diff changeset
    90
  in (name, {fixes = xs, assumes = asms, binds = [bind]}) end;
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    91
11983
85141af30120 removed obsolete make_raw;
wenzelm
parents: 11764
diff changeset
    92
fun make open_parms raw_thm names =
10811
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    93
  let val thm = Tactic.norm_hhf raw_thm in
11983
85141af30120 removed obsolete make_raw;
wenzelm
parents: 11764
diff changeset
    94
    #1 (foldr (fn (name, (cases, i)) => (prep_case open_parms thm name i :: cases, i - 1))
85141af30120 removed obsolete make_raw;
wenzelm
parents: 11764
diff changeset
    95
      (Library.drop (length names - Thm.nprems_of thm, names), ([], length names)))
10811
98f52cb93d93 support ?case binding;
wenzelm
parents: 10530
diff changeset
    96
  end;
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    97
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
    98
8427
wenzelm
parents: 8400
diff changeset
    99
(* params *)
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
   100
11002
e33dfe9bde39 added foldln
oheimb
parents: 10886
diff changeset
   101
fun rename_params xss thm = foldln Thm.rename_params_rule xss thm
10530
df079a585e6d added consumes, consumes_default;
wenzelm
parents: 10407
diff changeset
   102
  |> save thm;
8364
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
   103
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
   104
fun params xss = Drule.rule_attribute (K (rename_params xss));
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
   105
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
   106
0eb9ee70c8f8 added Isar/rule_cases.ML;
wenzelm
parents:
diff changeset
   107
end;