src/Pure/Isar/subclass.ML
author wenzelm
Sun, 10 Feb 2008 20:49:48 +0100
changeset 26054 345e495d3b92
parent 25620 a6cb8f60cff7
child 26276 3386bb568550
permissions -rw-r--r--
tuned spaces;
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
25620
a6cb8f60cff7 simplified
haftmann
parents: 25289
diff changeset
    22
    val thy = ProofContext.theory_of lthy;
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    23
    val sup = prep_class thy raw_sup;
25011
633afd909ff2 more informative TheoryTarget.peek operation;
wenzelm
parents: 25002
diff changeset
    24
    val sub = case TheoryTarget.peek lthy
633afd909ff2 more informative TheoryTarget.peek operation;
wenzelm
parents: 25002
diff changeset
    25
     of {is_class = false, ...} => error "No class context"
633afd909ff2 more informative TheoryTarget.peek operation;
wenzelm
parents: 25002
diff changeset
    26
      | {target, ...} => target;
25002
haftmann
parents: 24934
diff changeset
    27
    val sub_params = map fst (Class.these_params thy [sub]);
haftmann
parents: 24934
diff changeset
    28
    val sup_params = map fst (Class.these_params thy [sup]);
haftmann
parents: 24934
diff changeset
    29
    val err_params = subtract (op =) sub_params sup_params;
haftmann
parents: 24934
diff changeset
    30
    val _ = if null err_params then [] else
haftmann
parents: 24934
diff changeset
    31
      error ("Class " ^ Sign.string_of_sort thy [sub] ^ " lacks parameter(s) " ^
25620
a6cb8f60cff7 simplified
haftmann
parents: 25289
diff changeset
    32
        commas_quote err_params ^ " of " ^ Sign.string_of_sort thy [sup]);
25002
haftmann
parents: 24934
diff changeset
    33
    val sublocale_prop =
25027
44b60657f54f removed obsolete Class.class_of_locale/locale_of_class;
wenzelm
parents: 25011
diff changeset
    34
      Locale.global_asms_of thy sup
25002
haftmann
parents: 24934
diff changeset
    35
      |> maps snd
25620
a6cb8f60cff7 simplified
haftmann
parents: 25289
diff changeset
    36
      |> the_single
a6cb8f60cff7 simplified
haftmann
parents: 25289
diff changeset
    37
      |> ObjectLogic.ensure_propT thy;
a6cb8f60cff7 simplified
haftmann
parents: 25289
diff changeset
    38
    fun after_qed thm =
a6cb8f60cff7 simplified
haftmann
parents: 25289
diff changeset
    39
      LocalTheory.theory (Class.prove_subclass (sub, sup) thm)
25289
3d332d8a827c simplified LocalTheory.reinit;
wenzelm
parents: 25267
diff changeset
    40
      #> LocalTheory.reinit;
25002
haftmann
parents: 24934
diff changeset
    41
  in
haftmann
parents: 24934
diff changeset
    42
    do_proof after_qed sublocale_prop lthy
haftmann
parents: 24934
diff changeset
    43
  end;
24934
9f5d60fe9086 renamed AxClass.get_definition to AxClass.get_info (again);
wenzelm
parents: 24914
diff changeset
    44
25620
a6cb8f60cff7 simplified
haftmann
parents: 25289
diff changeset
    45
fun user_proof after_qed prop =
a6cb8f60cff7 simplified
haftmann
parents: 25289
diff changeset
    46
  Proof.theorem_i NONE (after_qed o the_single o the_single) [[(prop, [])]];
25002
haftmann
parents: 24934
diff changeset
    47
25620
a6cb8f60cff7 simplified
haftmann
parents: 25289
diff changeset
    48
fun tactic_proof tac after_qed prop lthy =
a6cb8f60cff7 simplified
haftmann
parents: 25289
diff changeset
    49
  after_qed (Goal.prove (LocalTheory.target_of lthy) [] [] prop
25002
haftmann
parents: 24934
diff changeset
    50
    (K tac)) lthy;
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    51
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    52
in
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    53
25002
haftmann
parents: 24934
diff changeset
    54
val subclass = gen_subclass (K I) user_proof;
haftmann
parents: 24934
diff changeset
    55
val subclass_cmd = gen_subclass Sign.read_class user_proof;
haftmann
parents: 24934
diff changeset
    56
fun prove_subclass tac = gen_subclass (K I) (tactic_proof tac);
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    57
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    58
end; (*local*)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    59
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    60
end;