src/Pure/Isar/subclass.ML
author haftmann
Thu, 25 Oct 2007 19:27:54 +0200
changeset 25196 0db9a16c0d3c
parent 25189 a1997f7a394a
child 25267 1f745c599b5c
permissions -rw-r--r--
moved primitive operations to class.ML
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
     1
(*  Title:      Pure/Isar/subclass.ML
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
     2
    ID:         $Id$
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
     3
    Author:     Florian Haftmann, TU Muenchen
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
     4
25196
0db9a16c0d3c moved primitive operations to class.ML
haftmann
parents: 25189
diff changeset
     5
User interface for proving subclass relationship between type classes.
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
     6
*)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
     7
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
     8
signature SUBCLASS =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
     9
sig
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    10
  val subclass: class -> local_theory -> Proof.state
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    11
  val subclass_cmd: xstring -> local_theory -> Proof.state
25002
haftmann
parents: 24934
diff changeset
    12
  val prove_subclass: tactic -> class -> local_theory -> local_theory
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    13
end;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    14
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    15
structure Subclass : SUBCLASS =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    16
struct
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    17
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    18
local
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    19
25002
haftmann
parents: 24934
diff changeset
    20
fun gen_subclass prep_class do_proof raw_sup lthy =
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    21
  let
25189
a1997f7a394a propagation through class hierarchy
haftmann
parents: 25166
diff changeset
    22
    (*FIXME make more use of local context; drop redundancies*)
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    23
    val ctxt = LocalTheory.target_of lthy;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    24
    val thy = ProofContext.theory_of ctxt;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    25
    val sup = prep_class thy raw_sup;
25011
633afd909ff2 more informative TheoryTarget.peek operation;
wenzelm
parents: 25002
diff changeset
    26
    val sub = case TheoryTarget.peek lthy
633afd909ff2 more informative TheoryTarget.peek operation;
wenzelm
parents: 25002
diff changeset
    27
     of {is_class = false, ...} => error "No class context"
633afd909ff2 more informative TheoryTarget.peek operation;
wenzelm
parents: 25002
diff changeset
    28
      | {target, ...} => target;
25002
haftmann
parents: 24934
diff changeset
    29
    val sub_params = map fst (Class.these_params thy [sub]);
haftmann
parents: 24934
diff changeset
    30
    val sup_params = map fst (Class.these_params thy [sup]);
haftmann
parents: 24934
diff changeset
    31
    val err_params = subtract (op =) sub_params sup_params;
haftmann
parents: 24934
diff changeset
    32
    val _ = if null err_params then [] else
haftmann
parents: 24934
diff changeset
    33
      error ("Class " ^ Sign.string_of_sort thy [sub] ^ " lacks parameter(s) " ^
haftmann
parents: 24934
diff changeset
    34
          commas_quote err_params ^ " of " ^ Sign.string_of_sort thy [sup]);
haftmann
parents: 24934
diff changeset
    35
    val sublocale_prop =
25027
44b60657f54f removed obsolete Class.class_of_locale/locale_of_class;
wenzelm
parents: 25011
diff changeset
    36
      Locale.global_asms_of thy sup
25002
haftmann
parents: 24934
diff changeset
    37
      |> maps snd
haftmann
parents: 24934
diff changeset
    38
      |> map (ObjectLogic.ensure_propT thy);
haftmann
parents: 24934
diff changeset
    39
    fun after_qed thms =
25196
0db9a16c0d3c moved primitive operations to class.ML
haftmann
parents: 25189
diff changeset
    40
      LocalTheory.theory (Class.prove_subclass (sub, sup) thms ctxt)
25189
a1997f7a394a propagation through class hierarchy
haftmann
parents: 25166
diff changeset
    41
      (*#> (fn lthy => LocalTheory.reinit lthy thy) FIXME does not work as expected*);
25002
haftmann
parents: 24934
diff changeset
    42
  in
haftmann
parents: 24934
diff changeset
    43
    do_proof after_qed sublocale_prop lthy
haftmann
parents: 24934
diff changeset
    44
  end;
24934
9f5d60fe9086 renamed AxClass.get_definition to AxClass.get_info (again);
wenzelm
parents: 24914
diff changeset
    45
25002
haftmann
parents: 24934
diff changeset
    46
fun user_proof after_qed props =
haftmann
parents: 24934
diff changeset
    47
  Proof.theorem_i NONE (after_qed o the_single) [map (rpair []) props];
haftmann
parents: 24934
diff changeset
    48
haftmann
parents: 24934
diff changeset
    49
fun tactic_proof tac after_qed props lthy =
haftmann
parents: 24934
diff changeset
    50
  after_qed (Goal.prove_multi (LocalTheory.target_of lthy) [] [] props
haftmann
parents: 24934
diff changeset
    51
    (K tac)) lthy;
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    52
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    53
in
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    54
25002
haftmann
parents: 24934
diff changeset
    55
val subclass = gen_subclass (K I) user_proof;
haftmann
parents: 24934
diff changeset
    56
val subclass_cmd = gen_subclass Sign.read_class user_proof;
haftmann
parents: 24934
diff changeset
    57
fun prove_subclass tac = gen_subclass (K I) (tactic_proof tac);
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    58
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    59
end; (*local*)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    60
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    61
end;