src/Pure/Isar/subclass.ML
author wenzelm
Tue, 09 Oct 2007 00:20:13 +0200
changeset 24920 2a45e400fdad
parent 24914 95cda5dd58d5
child 24934 9f5d60fe9086
permissions -rw-r--r--
generic Syntax.pretty/string_of operations;
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
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
     5
Prove subclass relations between type classes
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
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    12
  (*FIXME val prove_subclass: tactic -> class * class -> theory -> theory*)
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
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    51
fun mk_subclass_rule lthy sup =
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
    (*FIXME check for proper parameter inclusion (consts_of) (?)*)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    54
    val ctxt = LocalTheory.target_of lthy;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    55
    val thy = ProofContext.theory_of ctxt;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    56
    val locale = Class.locale_of_class thy sup;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    57
  in
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    58
    Locale.global_asms_of thy locale
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    59
    |> maps snd
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    60
    |> map (ObjectLogic.ensure_propT thy)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    61
  end;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    62
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    63
fun gen_subclass prep_class raw_sup lthy =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    64
  let
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    65
    (*FIXME cleanup, provide tactical interface*)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    66
    val ctxt = LocalTheory.target_of lthy;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    67
    val thy = ProofContext.theory_of ctxt;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    68
    val ctxt_thy = ProofContext.init thy;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    69
    val sup = prep_class thy raw_sup;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    70
    val sub = case Option.mapPartial (Class.class_of_locale thy)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    71
       (TheoryTarget.peek lthy)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    72
     of NONE => error "not in class context"
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    73
      | SOME sub => sub;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    74
    val export =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    75
      Assumption.export false ctxt ctxt_thy
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    76
      #> singleton (Variable.export ctxt ctxt_thy);
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    77
    val loc_name = Class.locale_of_class thy sub;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    78
    val loc_expr = Locale.Locale (Class.locale_of_class thy sup);
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    79
    fun prove_classrel interp thy =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    80
      let
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    81
        val classes = Sign.complete_sort thy [sup]
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    82
          |> filter_out (fn class' => Sign.subsort thy ([sub], [class']));
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    83
        fun instance_subclass (class1, class2) thy  =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    84
          let
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    85
            val ax = #axioms (AxClass.get_definition thy class1);
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    86
            val intro = #intro (AxClass.get_definition thy class2)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    87
              |> Drule.instantiate' [SOME (Thm.ctyp_of thy
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    88
                  (TVar ((Name.aT, 0), [class1])))] [];
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    89
            val thm =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    90
              intro
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    91
              |> OF_LAST (interp OF ax)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    92
              |> strip_all_ofclass thy (Sign.super_classes thy class2);
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    93
          in
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    94
            thy |> AxClass.add_classrel thm
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    95
          end;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    96
      in
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    97
        thy |> fold_rev (curry instance_subclass sub) classes
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    98
      end;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
    99
    fun after_qed thmss =
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   100
      let
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   101
        val thm = Conjunction.intr_balanced (the_single thmss);;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   102
        val interp = export thm;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   103
      in
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   104
        LocalTheory.theory (prove_classrel interp
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   105
          #> prove_interpretation_in (ProofContext.fact_tac [thm] 1)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   106
             I (loc_name, loc_expr))
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   107
        (*#> (fn lthy => LocalTheory.reinit lthy thy) FIXME does not work as expected*)
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   108
      end;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   109
    val goal = Element.Shows
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   110
      [(("", []), map (rpair []) (mk_subclass_rule lthy sup))];
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   111
  in 
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   112
    Specification.theorem_i Thm.internalK NONE after_qed ("", []) [] goal true lthy
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   113
  end;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   114
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   115
in
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   116
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   117
val subclass = gen_subclass (K I);
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   118
val subclass_cmd = gen_subclass Sign.read_class;
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   119
95cda5dd58d5 added proper subclass concept; improved class target
haftmann
parents:
diff changeset
   120
end; (*local*)
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
end;