src/Pure/Isar/local_defs.ML
author wenzelm
Sun, 30 Jul 2000 12:53:22 +0200
changeset 9467 52fb37876254
parent 9324 9c65fb3a7874
child 10464 b7b916a82dca
permissions -rw-r--r--
local_def(_i): no constraint on var; exporter setup;
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
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    21
(* export_defs *)
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    22
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    23
local
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    24
7502
wenzelm
parents: 7416
diff changeset
    25
val refl_tac = Tactic.rtac (Drule.standard (Drule.reflexive_thm RS Drule.triv_goal));
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    26
9467
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    27
fun dest_lhs cprop =
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    28
  let val x = #1 (Logic.dest_equals (Logic.dest_goal (Thm.term_of cprop)))
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    29
  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
    30
  handle TERM _ => raise TERM ("Malformed definitional assumption encountered:\n" ^
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    31
      quote (Display.string_of_cterm cprop), []);
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    32
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    33
fun disch_defs cprops thm =
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    34
  thm
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    35
  |> Drule.implies_intr_list cprops
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    36
  |> Drule.forall_intr_list (map dest_lhs cprops)
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    37
  |> Drule.forall_elim_vars 0
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    38
  |> RANGE (replicate (length cprops) refl_tac) 1;
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    39
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    40
in
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    41
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    42
val export_defs = (disch_defs, fn _ => fn _ => []);
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    43
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    44
end;
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    45
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    46
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    47
(* def(_i) *)
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    48
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    49
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
    50
  let
9295
5fc3c1f84e8a prep rhs in original context;
wenzelm
parents: 8807
diff changeset
    51
    val _ = Proof.assert_forward state;
9324
9c65fb3a7874 use ProofContext.bind_skolem;
wenzelm
parents: 9295
diff changeset
    52
    val ctxt = Proof.context_of state;
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    53
9295
5fc3c1f84e8a prep rhs in original context;
wenzelm
parents: 8807
diff changeset
    54
    (*rhs*)
7416
a98963d70f81 Thm.def_name;
wenzelm
parents: 7271
diff changeset
    55
    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
    56
    val rhs = prep_term ctxt raw_rhs;
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    57
    val T = Term.fastype_of rhs;
9295
5fc3c1f84e8a prep rhs in original context;
wenzelm
parents: 8807
diff changeset
    58
    val pats = prep_pats T (ProofContext.declare_term rhs ctxt) raw_pats;
5fc3c1f84e8a prep rhs in original context;
wenzelm
parents: 8807
diff changeset
    59
5fc3c1f84e8a prep rhs in original context;
wenzelm
parents: 8807
diff changeset
    60
    (*lhs*)
9324
9c65fb3a7874 use ProofContext.bind_skolem;
wenzelm
parents: 9295
diff changeset
    61
    val lhs = ProofContext.bind_skolem ctxt [x] (Free (x, T));
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    62
  in
9324
9c65fb3a7874 use ProofContext.bind_skolem;
wenzelm
parents: 9295
diff changeset
    63
    state
9467
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    64
    |> fix [([x], None)]
8092
badbfb6ceac0 prepare patterns only once;
wenzelm
parents: 7667
diff changeset
    65
    |> Proof.match_bind_i [(pats, rhs)]
9467
52fb37876254 local_def(_i): no constraint on var;
wenzelm
parents: 9324
diff changeset
    66
    |> Proof.assm_i export_defs [(name, atts, [(Logic.mk_equals (lhs, rhs), ([], []))])]
6954
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    67
  end;
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    68
8092
badbfb6ceac0 prepare patterns only once;
wenzelm
parents: 7667
diff changeset
    69
val def = gen_def Proof.fix ProofContext.read_term ProofContext.read_term_pats;
badbfb6ceac0 prepare patterns only once;
wenzelm
parents: 7667
diff changeset
    70
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
    71
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    72
dbeafc269f4f added Isar/local_defs.ML;
wenzelm
parents:
diff changeset
    73
end;