src/Pure/Isar/subclass.ML
author haftmann
Fri, 25 Jul 2008 12:03:37 +0200
changeset 27684 f45fd1159a4b
parent 26950 80366b6eb94c
child 28716 ee6f9e50f9c8
permissions -rw-r--r--
subclass now also works for subclasses with empty specificaton
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
27684
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    20
fun the_option [x] = SOME x
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    21
  | the_option [] = NONE
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    22
  | the_option _ = raise Empty;
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    23
25002
haftmann
parents: 24934
diff changeset
    24
fun gen_subclass prep_class do_proof raw_sup lthy =
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    25
  let
25620
a6cb8f60cff7 simplified
haftmann
parents: 25289
diff changeset
    26
    val thy = ProofContext.theory_of lthy;
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    27
    val sup = prep_class thy raw_sup;
25011
633afd909ff2 more informative TheoryTarget.peek operation;
wenzelm
parents: 25002
diff changeset
    28
    val sub = case TheoryTarget.peek lthy
633afd909ff2 more informative TheoryTarget.peek operation;
wenzelm
parents: 25002
diff changeset
    29
     of {is_class = false, ...} => error "No class context"
633afd909ff2 more informative TheoryTarget.peek operation;
wenzelm
parents: 25002
diff changeset
    30
      | {target, ...} => target;
27684
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    31
    val _ = if Sign.subsort thy ([sup], [sub])
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    32
      then error ("Class " ^ Syntax.string_of_sort lthy [sup]
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    33
        ^ " 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
    34
      else ();
25002
haftmann
parents: 24934
diff changeset
    35
    val sub_params = map fst (Class.these_params thy [sub]);
haftmann
parents: 24934
diff changeset
    36
    val sup_params = map fst (Class.these_params thy [sup]);
haftmann
parents: 24934
diff changeset
    37
    val err_params = subtract (op =) sub_params sup_params;
haftmann
parents: 24934
diff changeset
    38
    val _ = if null err_params then [] else
26950
80366b6eb94c Syntax.string_of_sort: proper context;
wenzelm
parents: 26276
diff changeset
    39
      error ("Class " ^ Syntax.string_of_sort lthy [sub] ^ " lacks parameter(s) " ^
80366b6eb94c Syntax.string_of_sort: proper context;
wenzelm
parents: 26276
diff changeset
    40
        commas_quote err_params ^ " of " ^ Syntax.string_of_sort lthy [sup]);
25002
haftmann
parents: 24934
diff changeset
    41
    val sublocale_prop =
25027
44b60657f54f removed obsolete Class.class_of_locale/locale_of_class;
wenzelm
parents: 25011
diff changeset
    42
      Locale.global_asms_of thy sup
25002
haftmann
parents: 24934
diff changeset
    43
      |> maps snd
27684
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    44
      |> the_option
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    45
      |> Option.map (ObjectLogic.ensure_propT thy);
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    46
    fun after_qed some_thm =
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    47
      LocalTheory.theory (Class.prove_subclass (sub, sup) some_thm)
26276
3386bb568550 explicit re-init
haftmann
parents: 25620
diff changeset
    48
      #> (TheoryTarget.init (SOME sub) o ProofContext.theory_of);
25002
haftmann
parents: 24934
diff changeset
    49
  in
haftmann
parents: 24934
diff changeset
    50
    do_proof after_qed sublocale_prop lthy
haftmann
parents: 24934
diff changeset
    51
  end;
24934
9f5d60fe9086 renamed AxClass.get_definition to AxClass.get_info (again);
wenzelm
parents: 24914
diff changeset
    52
27684
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    53
fun user_proof after_qed NONE =
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    54
      Proof.theorem_i NONE (K (after_qed NONE)) [[]]
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    55
  | user_proof after_qed (SOME prop) =
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    56
      Proof.theorem_i NONE (after_qed o the_option o the_single) [[(prop, [])]];
25002
haftmann
parents: 24934
diff changeset
    57
27684
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    58
fun tactic_proof tac after_qed NONE lthy =
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    59
      after_qed NONE lthy
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    60
  | tactic_proof tac after_qed (SOME prop) lthy =
f45fd1159a4b subclass now also works for subclasses with empty specificaton
haftmann
parents: 26950
diff changeset
    61
      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
    62
        (K tac))) lthy;
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    63
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    64
in
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    65
25002
haftmann
parents: 24934
diff changeset
    66
val subclass = gen_subclass (K I) user_proof;
haftmann
parents: 24934
diff changeset
    67
val subclass_cmd = gen_subclass Sign.read_class user_proof;
haftmann
parents: 24934
diff changeset
    68
fun prove_subclass tac = gen_subclass (K I) (tactic_proof tac);
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    69
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    70
end; (*local*)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    71
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    72
end;