src/Pure/Isar/local_defs.ML
author wenzelm
Tue, 16 Oct 2001 23:02:14 +0200
changeset 11816 545aab7410ac
parent 11718 92706a69dacc
permissions -rw-r--r--
simplified exporter interface;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Isar/local_defs.ML
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
8807
wenzelm
parents: 8092
diff changeset
     4
    License:    GPL (GNU GENERAL PUBLIC LICENSE)
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
     5
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
     6
Local definitions.
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
     7
*)
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
     8
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
     9
signature LOCAL_DEFS =
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    10
sig
9467
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    11
  val def: string -> Proof.context attribute list -> string *  (string * string list)
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    12
    -> Proof.state -> Proof.state
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    13
  val def_i: string -> Proof.context attribute list -> string * (term * term list)
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    14
    -> Proof.state -> Proof.state
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    15
end;
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    16
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    17
structure LocalDefs: LOCAL_DEFS =
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    18
struct
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    19
9467
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    20
11816
545aab7410ac simplified exporter interface;
wenzelm
parents: 11718
diff changeset
    21
(* export_def *)
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    22
9467
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    23
fun dest_lhs cprop =
11816
545aab7410ac simplified exporter interface;
wenzelm
parents: 11718
diff changeset
    24
  let val x = #1 (Logic.dest_equals (Thm.term_of cprop))
9467
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    25
  in Term.dest_Free x; Thm.cterm_of (Thm.sign_of_cterm cprop) x end
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    26
  handle TERM _ => raise TERM ("Malformed definitional assumption encountered:\n" ^
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    27
      quote (Display.string_of_cterm cprop), []);
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    28
11816
545aab7410ac simplified exporter interface;
wenzelm
parents: 11718
diff changeset
    29
fun export_def _ cprops thm =
9467
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    30
  thm
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    31
  |> Drule.implies_intr_list cprops
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    32
  |> Drule.forall_intr_list (map dest_lhs cprops)
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    33
  |> Drule.forall_elim_vars 0
11816
545aab7410ac simplified exporter interface;
wenzelm
parents: 11718
diff changeset
    34
  |> RANGE (replicate (length cprops) (Tactic.rtac Drule.reflexive_thm)) 1;
9467
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    35
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    36
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    37
(* def(_i) *)
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    38
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    39
fun gen_def fix prep_term prep_pats raw_name atts (x, (raw_rhs, raw_pats)) state =
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    40
  let
9295
5fc3c1f84e8a prep rhs in original context;
wenzelm
parents: 8807
diff changeset
    41
    val _ = Proof.assert_forward state;
9324
9c65fb3a7874 use ProofContext.bind_skolem;
wenzelm
parents: 9295
diff changeset
    42
    val ctxt = Proof.context_of state;
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    43
9295
5fc3c1f84e8a prep rhs in original context;
wenzelm
parents: 8807
diff changeset
    44
    (*rhs*)
7416
a98963d70f81 Thm.def_name;
wenzelm
parents: 7271
diff changeset
    45
    val name = if raw_name = "" then Thm.def_name x else raw_name;
9295
5fc3c1f84e8a prep rhs in original context;
wenzelm
parents: 8807
diff changeset
    46
    val rhs = prep_term ctxt raw_rhs;
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    47
    val T = Term.fastype_of rhs;
9295
5fc3c1f84e8a prep rhs in original context;
wenzelm
parents: 8807
diff changeset
    48
    val pats = prep_pats T (ProofContext.declare_term rhs ctxt) raw_pats;
5fc3c1f84e8a prep rhs in original context;
wenzelm
parents: 8807
diff changeset
    49
5fc3c1f84e8a prep rhs in original context;
wenzelm
parents: 8807
diff changeset
    50
    (*lhs*)
9324
9c65fb3a7874 use ProofContext.bind_skolem;
wenzelm
parents: 9295
diff changeset
    51
    val lhs = ProofContext.bind_skolem ctxt [x] (Free (x, T));
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    52
  in
9324
9c65fb3a7874 use ProofContext.bind_skolem;
wenzelm
parents: 9295
diff changeset
    53
    state
9467
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    54
    |> fix [([x], None)]
8092
badbfb6ceac0 prepare patterns only once;
wenzelm
parents: 7667
diff changeset
    55
    |> Proof.match_bind_i [(pats, rhs)]
11816
545aab7410ac simplified exporter interface;
wenzelm
parents: 11718
diff changeset
    56
    |> Proof.assm_i export_def [((name, atts), [(Logic.mk_equals (lhs, rhs), ([], []))])]
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    57
  end;
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    58
8092
badbfb6ceac0 prepare patterns only once;
wenzelm
parents: 7667
diff changeset
    59
val def = gen_def Proof.fix ProofContext.read_term ProofContext.read_term_pats;
badbfb6ceac0 prepare patterns only once;
wenzelm
parents: 7667
diff changeset
    60
val def_i = gen_def Proof.fix_i ProofContext.cert_term ProofContext.cert_term_pats;
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    61
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    62
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    63
end;