src/Pure/Isar/subclass.ML
author haftmann
Fri, 12 Oct 2007 14:42:30 +0200
changeset 25002 c3d9cb390471
parent 24934 9f5d60fe9086
child 25011 633afd909ff2
permissions -rw-r--r--
tuned
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
25002
haftmann
parents: 24934
diff changeset
     5
Prove 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
(** auxiliary **)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    19
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    20
fun prove_interpretation_in tac after_qed (name, expr) =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    21
  Locale.interpretation_in_locale
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    22
      (ProofContext.theory after_qed) (name, expr)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    23
  #> Proof.global_terminal_proof
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    24
      (Method.Basic (K (Method.SIMPLE_METHOD tac), Position.none), NONE)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    25
  #> ProofContext.theory_of;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    26
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    27
fun OF_LAST thm1 thm2 =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    28
  let
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    29
    val n = (length o Logic.strip_imp_prems o prop_of) thm2;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    30
  in (thm1 RSN (n, thm2)) end;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    31
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    32
fun strip_all_ofclass thy sort =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    33
  let
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    34
    val typ = TVar ((Name.aT, 0), sort);
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    35
    fun prem_inclass t =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    36
      case Logic.strip_imp_prems t
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    37
       of ofcls :: _ => try Logic.dest_inclass ofcls
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    38
        | [] => NONE;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    39
    fun strip_ofclass class thm =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    40
      thm OF (fst o AxClass.of_sort thy (typ, [class])) AxClass.cache;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    41
    fun strip thm = case (prem_inclass o Thm.prop_of) thm
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    42
     of SOME (_, class) => thm |> strip_ofclass class |> strip
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    43
      | NONE => thm;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    44
  in strip end;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    45
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    46
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    47
(** subclassing **)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    48
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    49
local
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    50
25002
haftmann
parents: 24934
diff changeset
    51
fun gen_subclass prep_class do_proof raw_sup lthy =
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    52
  let
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    53
    val ctxt = LocalTheory.target_of lthy;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    54
    val thy = ProofContext.theory_of ctxt;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    55
    val ctxt_thy = ProofContext.init thy;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    56
    val sup = prep_class thy raw_sup;
25002
haftmann
parents: 24934
diff changeset
    57
    val sub = case Option.mapPartial (Class.class_of_locale thy) (TheoryTarget.peek lthy)
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    58
     of NONE => error "not in class context"
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    59
      | SOME sub => sub;
25002
haftmann
parents: 24934
diff changeset
    60
    val sub_params = map fst (Class.these_params thy [sub]);
haftmann
parents: 24934
diff changeset
    61
    val sup_params = map fst (Class.these_params thy [sup]);
haftmann
parents: 24934
diff changeset
    62
    val err_params = subtract (op =) sub_params sup_params;
haftmann
parents: 24934
diff changeset
    63
    val _ = if null err_params then [] else
haftmann
parents: 24934
diff changeset
    64
      error ("Class " ^ Sign.string_of_sort thy [sub] ^ " lacks parameter(s) " ^
haftmann
parents: 24934
diff changeset
    65
          commas_quote err_params ^ " of " ^ Sign.string_of_sort thy [sup]);
haftmann
parents: 24934
diff changeset
    66
    val sublocale_prop =
haftmann
parents: 24934
diff changeset
    67
      Locale.global_asms_of thy (Class.locale_of_class thy sup)
haftmann
parents: 24934
diff changeset
    68
      |> maps snd
haftmann
parents: 24934
diff changeset
    69
      |> map (ObjectLogic.ensure_propT thy);
haftmann
parents: 24934
diff changeset
    70
    val supclasses = Sign.complete_sort thy [sup]
haftmann
parents: 24934
diff changeset
    71
      |> filter_out (fn class => Sign.subsort thy ([sub], [class]));
haftmann
parents: 24934
diff changeset
    72
    val supclasses' = remove (op =) sup supclasses;
haftmann
parents: 24934
diff changeset
    73
    val _ = if null supclasses' then () else
haftmann
parents: 24934
diff changeset
    74
      error ("The following superclasses of " ^ sup
haftmann
parents: 24934
diff changeset
    75
        ^ " are no superclass of " ^ sub ^ ": "
haftmann
parents: 24934
diff changeset
    76
        ^ commas supclasses');
haftmann
parents: 24934
diff changeset
    77
      (*FIXME*)
haftmann
parents: 24934
diff changeset
    78
    val sub_ax = #axioms (AxClass.get_info thy sub);
haftmann
parents: 24934
diff changeset
    79
    val sub_inst = Thm.ctyp_of thy (TVar ((Name.aT, 0), [sub]));
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    80
    val loc_name = Class.locale_of_class thy sub;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    81
    val loc_expr = Locale.Locale (Class.locale_of_class thy sup);
25002
haftmann
parents: 24934
diff changeset
    82
    fun prove_classrel subclass_rule =
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    83
      let
25002
haftmann
parents: 24934
diff changeset
    84
        fun add_classrel sup' thy  =
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    85
          let
25002
haftmann
parents: 24934
diff changeset
    86
            val classrel =
haftmann
parents: 24934
diff changeset
    87
              #intro (AxClass.get_info thy sup')
haftmann
parents: 24934
diff changeset
    88
              |> Drule.instantiate' [SOME sub_inst] []
haftmann
parents: 24934
diff changeset
    89
              |> OF_LAST (subclass_rule OF sub_ax)
haftmann
parents: 24934
diff changeset
    90
              |> strip_all_ofclass thy (Sign.super_classes thy sup');
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    91
          in
25002
haftmann
parents: 24934
diff changeset
    92
            AxClass.add_classrel classrel thy
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    93
          end;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    94
      in
25002
haftmann
parents: 24934
diff changeset
    95
        fold_rev add_classrel supclasses
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    96
      end;
25002
haftmann
parents: 24934
diff changeset
    97
    fun prove_interpretation sublocale_rule =
haftmann
parents: 24934
diff changeset
    98
      prove_interpretation_in (ProofContext.fact_tac [sublocale_rule] 1)
haftmann
parents: 24934
diff changeset
    99
        I (loc_name, loc_expr)
haftmann
parents: 24934
diff changeset
   100
    fun after_qed thms =
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   101
      let
25002
haftmann
parents: 24934
diff changeset
   102
        val sublocale_rule = Conjunction.intr_balanced thms;
haftmann
parents: 24934
diff changeset
   103
        val subclass_rule = sublocale_rule
haftmann
parents: 24934
diff changeset
   104
          |> Assumption.export false ctxt ctxt_thy
haftmann
parents: 24934
diff changeset
   105
          |> singleton (Variable.export ctxt ctxt_thy);
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   106
      in
25002
haftmann
parents: 24934
diff changeset
   107
        LocalTheory.theory (prove_classrel subclass_rule
haftmann
parents: 24934
diff changeset
   108
          #> prove_interpretation sublocale_rule)
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   109
        (*#> (fn lthy => LocalTheory.reinit lthy thy) FIXME does not work as expected*)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   110
      end;
25002
haftmann
parents: 24934
diff changeset
   111
  in
haftmann
parents: 24934
diff changeset
   112
    do_proof after_qed sublocale_prop lthy
haftmann
parents: 24934
diff changeset
   113
  end;
24934
9f5d60fe9086 renamed AxClass.get_definition to AxClass.get_info (again);
wenzelm
parents: 24914
diff changeset
   114
25002
haftmann
parents: 24934
diff changeset
   115
fun user_proof after_qed props =
haftmann
parents: 24934
diff changeset
   116
  Proof.theorem_i NONE (after_qed o the_single) [map (rpair []) props];
haftmann
parents: 24934
diff changeset
   117
haftmann
parents: 24934
diff changeset
   118
fun tactic_proof tac after_qed props lthy =
haftmann
parents: 24934
diff changeset
   119
  after_qed (Goal.prove_multi (LocalTheory.target_of lthy) [] [] props
haftmann
parents: 24934
diff changeset
   120
    (K tac)) lthy;
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   121
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   122
in
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   123
25002
haftmann
parents: 24934
diff changeset
   124
val subclass = gen_subclass (K I) user_proof;
haftmann
parents: 24934
diff changeset
   125
val subclass_cmd = gen_subclass Sign.read_class user_proof;
haftmann
parents: 24934
diff changeset
   126
fun prove_subclass tac = gen_subclass (K I) (tactic_proof tac);
24914
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   127
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   128
end; (*local*)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   129
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   130
end;