src/Pure/Isar/instance.ML
author wenzelm
Sat, 10 Nov 2007 18:36:10 +0100
changeset 25381 c100bf5bd6b8
parent 25016 2bcac52d7abc
child 25462 dad0291cb76a
permissions -rw-r--r--
removed LocalTheory.target_naming/name;
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
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
     5
User-level instantiation interface for classes.
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
     6
FIXME not operative for the moment
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
     7
*)
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
     8
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
     9
signature INSTANCE =
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    10
sig
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    11
  val begin_instantiation: arity list -> theory -> local_theory
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    12
  val begin_instantiation_cmd: (xstring * string list * string) list
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    13
    -> theory -> local_theory
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    14
  val proof_instantiation: local_theory -> Proof.state
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    15
end;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    16
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    17
structure Instance : INSTANCE =
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    18
struct
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    19
24713
8b3b6d09ef40 tuned functor application;
wenzelm
parents: 24592
diff changeset
    20
structure Instantiation = ProofDataFun
8b3b6d09ef40 tuned functor application;
wenzelm
parents: 24592
diff changeset
    21
(
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    22
  type T = ((string * (string * sort) list) * sort) list * ((string * typ) * string) list;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    23
  fun init _ = ([], []);
24713
8b3b6d09ef40 tuned functor application;
wenzelm
parents: 24592
diff changeset
    24
);
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    25
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    26
local
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    27
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    28
fun gen_begin_instantiation prep_arity raw_arities thy =
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    29
  let
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    30
    fun prep_arity' raw_arity names =
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    31
      let
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    32
        val arity as (tyco, sorts, sort) = prep_arity thy raw_arity;
24848
5dbbd33c3236 replaced literal 'a by Name.aT;
wenzelm
parents: 24713
diff changeset
    33
        val vs = Name.invents names Name.aT (length sorts);
5dbbd33c3236 replaced literal 'a by Name.aT;
wenzelm
parents: 24713
diff changeset
    34
        val names' = fold Name.declare vs names;
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    35
      in (((tyco, vs ~~ sorts), sort), names') end;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    36
    val (arities, _) = fold_map prep_arity' raw_arities Name.context;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    37
    fun get_param tyco ty_subst (param, (c, ty)) =
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    38
      ((param ^ "_" ^ NameSpace.base tyco, map_atyps (K ty_subst) ty),
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    39
        Class.unoverload_const thy (c, ty));
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    40
    fun get_params ((tyco, vs), sort) =
25002
haftmann
parents: 24984
diff changeset
    41
      Class.these_params thy sort
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    42
      |> map (get_param tyco (Type (tyco, map TFree vs)));
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    43
    val params = maps get_params arities;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    44
    val ctxt =
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    45
      ProofContext.init thy
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    46
      |> Instantiation.put (arities, params);
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    47
    val thy_target = TheoryTarget.begin "" ctxt;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    48
    val operations = {
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    49
        pretty = LocalTheory.pretty,
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    50
        axioms = LocalTheory.axioms,
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    51
        abbrev = LocalTheory.abbrev,
25016
2bcac52d7abc renamed LocalTheory.def to LocalTheory.define;
wenzelm
parents: 25002
diff changeset
    52
        define = LocalTheory.define,
24592
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    53
        notes = LocalTheory.notes,
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    54
        type_syntax = LocalTheory.type_syntax,
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    55
        term_syntax = LocalTheory.term_syntax,
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    56
        declaration = LocalTheory.pretty,
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    57
        reinit = LocalTheory.reinit,
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    58
        exit = LocalTheory.exit
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    59
      };
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    60
  in TheoryTarget.begin "" ctxt end;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    61
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    62
in
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    63
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    64
val begin_instantiation = gen_begin_instantiation Sign.cert_arity;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    65
val begin_instantiation_cmd = gen_begin_instantiation Sign.read_arity;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    66
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    67
end;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    68
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    69
fun gen_proof_instantiation do_proof after_qed lthy =
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    70
  let
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    71
    val ctxt = LocalTheory.target_of lthy;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    72
    val arities = case Instantiation.get ctxt
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    73
     of ([], _) => error "no instantiation target"
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    74
      | (arities, _) => map (fn ((tyco, vs), sort) => (tyco, map snd vs, sort)) arities;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    75
    val thy = ProofContext.theory_of ctxt;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    76
  in (do_proof after_qed arities) thy end;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    77
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    78
val proof_instantiation = gen_proof_instantiation Class.instance_arity I;
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    79
dfea1edbf711 added rudimentary instantiation stub
haftmann
parents:
diff changeset
    80
end;