src/Pure/Isar/subclass.ML
author ballarin
Tue, 30 Dec 2008 11:10:01 +0100
changeset 29252 ea97aa6aeba2
parent 29227 089499f104d3
permissions -rw-r--r--
Merged.
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
    Author:     Florian Haftmann, TU Muenchen
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
     3
25196
0db9a16c0d3c moved primitive operations to class.ML
haftmann
parents: 25189
diff changeset
     4
User interface for proving subclass relationship between type classes.
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
     5
*)
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
signature SUBCLASS =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
     8
sig
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
     9
  val subclass: class -> local_theory -> Proof.state
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    10
  val subclass_cmd: xstring -> local_theory -> Proof.state
25002
haftmann
parents: 24934
diff changeset
    11
  val prove_subclass: tactic -> class -> local_theory -> local_theory
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    12
end;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    13
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    14
structure Subclass : SUBCLASS =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    15
struct
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    16
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    17
local
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    18
25002
haftmann
parents: 24934
diff changeset
    19
fun gen_subclass prep_class do_proof raw_sup lthy =
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    20
  let
25620
a6cb8f60cff7 simplified
haftmann
parents: 25289
diff changeset
    21
    val thy = ProofContext.theory_of lthy;
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    22
    val sup = prep_class thy raw_sup;
25011
633afd909ff2 more informative TheoryTarget.peek operation;
wenzelm
parents: 25002
diff changeset
    23
    val sub = case TheoryTarget.peek lthy
29227
089499f104d3 Merged.
ballarin
parents: 28716
diff changeset
    24
     of {is_class = false, ...} => error "Not a class context"
25011
633afd909ff2 more informative TheoryTarget.peek operation;
wenzelm
parents: 25002
diff changeset
    25
      | {target, ...} => target;
27684
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    26
    val _ = if Sign.subsort thy ([sup], [sub])
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    27
      then error ("Class " ^ Syntax.string_of_sort lthy [sup]
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    28
        ^ " is subclass of class " ^ Syntax.string_of_sort lthy [sub])
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    29
      else ();
25002
haftmann
parents: 24934
diff changeset
    30
    val sub_params = map fst (Class.these_params thy [sub]);
haftmann
parents: 24934
diff changeset
    31
    val sup_params = map fst (Class.these_params thy [sup]);
haftmann
parents: 24934
diff changeset
    32
    val err_params = subtract (op =) sub_params sup_params;
haftmann
parents: 24934
diff changeset
    33
    val _ = if null err_params then [] else
26950
80366b6eb94c Syntax.string_of_sort: proper context;
wenzelm
parents: 26276
diff changeset
    34
      error ("Class " ^ Syntax.string_of_sort lthy [sub] ^ " lacks parameter(s) " ^
80366b6eb94c Syntax.string_of_sort: proper context;
wenzelm
parents: 26276
diff changeset
    35
        commas_quote err_params ^ " of " ^ Syntax.string_of_sort lthy [sup]);
25002
haftmann
parents: 24934
diff changeset
    36
    val sublocale_prop =
25027
44b60657f54f removed obsolete Class.class_of_locale/locale_of_class;
wenzelm
parents: 25011
diff changeset
    37
      Locale.global_asms_of thy sup
25002
haftmann
parents: 24934
diff changeset
    38
      |> maps snd
28716
haftmann
parents: 27684
diff changeset
    39
      |> try the_single
27684
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    40
      |> Option.map (ObjectLogic.ensure_propT thy);
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    41
    fun after_qed some_thm =
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    42
      LocalTheory.theory (Class.prove_subclass (sub, sup) some_thm)
26276
3386bb568550 explicit re-init
haftmann
parents: 25620
diff changeset
    43
      #> (TheoryTarget.init (SOME sub) o ProofContext.theory_of);
25002
haftmann
parents: 24934
diff changeset
    44
  in
haftmann
parents: 24934
diff changeset
    45
    do_proof after_qed sublocale_prop lthy
haftmann
parents: 24934
diff changeset
    46
  end;
24934
9f5d60fe9086 renamed AxClass.get_definition to AxClass.get_info (again);
wenzelm
parents: 24914
diff changeset
    47
27684
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    48
fun user_proof after_qed NONE =
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    49
      Proof.theorem_i NONE (K (after_qed NONE)) [[]]
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    50
  | user_proof after_qed (SOME prop) =
28716
haftmann
parents: 27684
diff changeset
    51
      Proof.theorem_i NONE (after_qed o try the_single o the_single) [[(prop, [])]];
25002
haftmann
parents: 24934
diff changeset
    52
27684
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    53
fun tactic_proof tac after_qed NONE lthy =
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    54
      after_qed NONE lthy
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    55
  | tactic_proof tac after_qed (SOME prop) lthy =
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    56
      after_qed (SOME (Goal.prove (LocalTheory.target_of lthy) [] [] prop
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    57
        (K tac))) lthy;
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
in
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    60
25002
haftmann
parents: 24934
diff changeset
    61
val subclass = gen_subclass (K I) user_proof;
haftmann
parents: 24934
diff changeset
    62
val subclass_cmd = gen_subclass Sign.read_class user_proof;
haftmann
parents: 24934
diff changeset
    63
fun prove_subclass tac = gen_subclass (K I) (tactic_proof tac);
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    64
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    65
end; (*local*)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    66
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    67
end;