src/Pure/Isar/instance.ML
author haftmann
Fri, 23 Nov 2007 21:09:35 +0100
changeset 25462 dad0291cb76a
parent 25381 c100bf5bd6b8
child 25485 33840a854e63
permissions -rw-r--r--
rudimentary instantiation target
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
     1
(*  Title:      Pure/Isar/instance.ML
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
     2
    ID:         $Id$
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
     3
    Author:     Florian Haftmann, TU Muenchen
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
     4
25462
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
     5
A primitive instance command, based on instantiation target.
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
     6
*)
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
     7
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
     8
signature INSTANCE =
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
     9
sig
25462
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    10
  val instantiate: arity list -> (local_theory -> local_theory)
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    11
    -> (Proof.context -> tactic) -> theory -> theory
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    12
  val instance: arity list -> ((bstring * Attrib.src list) * term) list
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    13
    -> (thm list -> theory -> theory)
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    14
    -> theory -> Proof.state
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    15
  val prove_instance: tactic -> arity list -> ((bstring * Attrib.src list) * term) list
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    16
    -> theory -> thm list * theory
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    17
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    18
  val instantiation_cmd: (xstring * sort * xstring) list
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    19
    -> theory -> local_theory
25462
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    20
  val instance_cmd: (xstring * sort * xstring) list -> ((bstring * Attrib.src list) * xstring) list
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    21
    -> (thm list -> theory -> theory)
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    22
    -> theory -> Proof.state
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    23
end;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    24
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    25
structure Instance : INSTANCE =
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    26
struct
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    27
25462
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    28
fun instantiation_cmd raw_arities thy =
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    29
  TheoryTarget.instantiation (map (Sign.read_arity thy) raw_arities) thy;
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    30
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    31
fun instantiate arities f tac =
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    32
  TheoryTarget.instantiation arities
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    33
  #> f
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    34
  #> Class.prove_instantiation tac
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    35
  #> LocalTheory.exit
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    36
  #> ProofContext.theory_of;
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    37
25462
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    38
fun gen_instance prep_arity prep_attr prep_term do_proof raw_arities defs after_qed thy =
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    39
  let
25462
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    40
    fun export_defs ctxt = 
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    41
      let
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    42
        val ctxt_thy = ProofContext.init (ProofContext.theory_of ctxt);
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    43
      in
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    44
        map (snd o snd)
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    45
        #> map (Assumption.export false ctxt ctxt_thy)
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    46
        #> Variable.export ctxt ctxt_thy
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    47
      end;
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    48
    fun mk_def ctxt ((name, raw_attr), raw_t) =
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    49
      let
25462
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    50
        val attr = map (prep_attr thy) raw_attr;
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    51
        val t = prep_term ctxt raw_t;
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    52
      in (NONE, ((name, attr), t)) end;
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    53
    val arities = map (prep_arity thy) raw_arities;
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    54
  in
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    55
    thy
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    56
    |> TheoryTarget.instantiation arities
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    57
    |> `(fn ctxt => map (mk_def ctxt) defs)
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    58
    |-> (fn defs => fold_map Specification.definition defs)
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    59
    |-> (fn defs => `(fn ctxt => export_defs ctxt defs))
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    60
    ||> LocalTheory.exit
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    61
    ||> ProofContext.theory_of
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    62
    ||> TheoryTarget.instantiation arities
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    63
    |-> (fn defs => do_proof defs (LocalTheory.theory (after_qed defs)))
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    64
  end;
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    65
25462
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    66
val instance = gen_instance Sign.cert_arity (K I) (K I)
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    67
  (fn _ => fn after_qed => Class.proof_instantiation (after_qed #> Class.conclude_instantiation));
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    68
val instance_cmd = gen_instance Sign.read_arity Attrib.intern_src
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    69
  (fn ctxt => Syntax.parse_prop ctxt #> Syntax.check_prop ctxt)
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    70
  (fn _ => fn after_qed => Class.proof_instantiation (after_qed #> Class.conclude_instantiation));
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    71
fun prove_instance tac arities defs = gen_instance Sign.cert_arity (K I) (K I)
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    72
  (fn defs => fn after_qed => Class.prove_instantiation (K tac)
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25381
diff changeset
    73
    #> after_qed #> Class.conclude_instantiation #> ProofContext.theory_of #> pair defs) arities defs (K I);
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    74
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    75
end;