src/HOL/Types_To_Sets/internalize_sort.ML
author eberlm <eberlm@in.tum.de>
Thu, 30 Nov 2017 16:59:59 +0100
changeset 67107 cef76a19125e
parent 64551 79e9587dbcca
child 69597 ff784d5a5bfb
permissions -rw-r--r--
Existence of a holomorphic logarithm
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64551
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/Types_To_Sets/internalize_sort.ML
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     2
    Author:     Ondřej Kunčar, TU München
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     3
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     4
A derived rule (by using Thm.unconstrainT) that internalizes
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     5
type class annotations.
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     6
*)
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     7
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     8
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     9
(*
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    10
                     \<phi>['a::{c_1, ..., c_n} / 'a]
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    11
---------------------------------------------------------------------
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    12
  class.c_1 ops_1 \<Longrightarrow> ... \<Longrightarrow> class.c_n ops_n \<Longrightarrow> \<phi>['a::type / 'a]
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    13
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    14
where class.c is the locale predicate associated with type class c and
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    15
ops are operations associated with type class c. For example:
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    16
If c = semigroup_add, then ops = op-, op+, 0, uminus.
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    17
If c = finite, then ops = TYPE('a::type).
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    18
*)
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    19
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    20
signature INTERNALIZE_SORT =
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    21
sig
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    22
  val internalize_sort:  ctyp -> thm -> typ * thm
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    23
  val internalize_sort_attr: typ -> attribute
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    24
end;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    25
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    26
structure Internalize_Sort : INTERNALIZE_SORT =
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    27
struct
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    28
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    29
fun internalize_sort ctvar thm =
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    30
  let
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    31
    val thy = Thm.theory_of_thm thm;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    32
    val tvar = Thm.typ_of ctvar;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    33
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    34
    val ((_, assms, classes),_) = Logic.unconstrainT [] (Thm.prop_of thm);
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    35
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    36
    fun is_proper_class thy = can (Axclass.get_info thy); (* trick by FH *)
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    37
    fun reduce_to_non_proper_sort (TVar (name, sort)) =
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    38
        TVar (name, Sign.minimize_sort thy (filter_out (is_proper_class thy) (Sign.complete_sort thy sort)))
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    39
      | reduce_to_non_proper_sort _ = error "not supported";
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    40
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    41
    val data = (map fst classes) ~~ assms;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    42
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    43
    val new_tvar = get_first (fn (tvar', ((ren_tvar, _), _)) => if tvar = tvar'
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    44
      then SOME (reduce_to_non_proper_sort ren_tvar) else NONE) data
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    45
      |> the_default tvar;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    46
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    47
    fun localify class = Class.rules thy class |> snd |> Thm.transfer thy;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    48
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    49
    fun discharge_of_class tvar class = Thm.of_class (Thm.global_ctyp_of thy tvar, class);
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    50
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    51
    val rules = map (fn (tvar', ((ren_tvar, class), _)) => if tvar = tvar'
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    52
      then (if Class.is_class thy class then localify class else discharge_of_class ren_tvar class)
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    53
      else discharge_of_class ren_tvar class) data;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    54
  in
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    55
    (new_tvar, (Thm.unconstrainT (Thm.strip_shyps thm) OF rules) |> Drule.zero_var_indexes)
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    56
  end;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    57
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    58
val tvar = Args.context -- Args.typ >> (fn (_, v as TFree _) => Logic.varifyT_global v
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    59
  | (ctxt, t) => error ("Not a type variable: " ^ Syntax.string_of_typ ctxt t));
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    60
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    61
fun internalize_sort_attr tvar =
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    62
  Thm.rule_attribute [] (fn context => fn thm =>
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    63
    (snd (internalize_sort (Thm.ctyp_of (Context.proof_of context) tvar) thm)));
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    64
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    65
val _ = Context.>> (Context.map_theory (Attrib.setup @{binding internalize_sort}
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    66
  (tvar >> internalize_sort_attr) "internalize a sort"));
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    67
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    68
end;