src/HOL/Types_To_Sets/unoverload_type.ML
author immler
Tue, 12 Jun 2018 16:21:52 +0200
changeset 68428 46beee72fb66
child 68429 38961724a017
permissions -rw-r--r--
a derived rule combining unoverload and internalize_sort
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
68428
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
     1
(*  Title:      HOL/Types_To_Sets/unoverload_type.ML
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
     2
    Author:     Fabian Immler, TU München
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
     3
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
     4
Internalize sorts and unoverload parameters of a type variable.
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
     5
*)
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
     6
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
     7
signature UNOVERLOAD_TYPE =
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
     8
sig
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
     9
  val unoverload_type: Context.generic -> string -> thm -> thm
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    10
  val unoverload_type_attr: string -> attribute
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    11
end;
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    12
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    13
structure Unoverload_Type : UNOVERLOAD_TYPE =
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    14
struct
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    15
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    16
fun those [] = []
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    17
  | those (NONE::xs) = those xs
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    18
  | those (SOME x::xs) = x::those xs
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    19
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    20
fun params_of_sort context sort =
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    21
  let
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    22
    val algebra = Sign.classes_of (Context.theory_of context)
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    23
    val params = List.concat (map (Sorts.super_classes algebra) sort) |>
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    24
      map (try (Axclass.get_info (Context.theory_of context))) |>
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    25
      those |>
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    26
      map #params |>
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    27
      List.concat
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    28
  in params end
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    29
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    30
fun unoverload_type context s thm =
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    31
  let
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    32
    val tvars = Term.add_tvars (Thm.prop_of thm) []
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    33
    val thy = Context.theory_of context
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    34
  in
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    35
  case find_first (fn ((n,_), _) => n = s) tvars of NONE =>
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    36
    raise THM ("unoverload_internalize_deps: type variable ("^s^") not in theorem", 0, [thm])
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    37
  | SOME (x as (_, sort)) =>
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    38
    let
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    39
      val (tvar, thm') = Internalize_Sort.internalize_sort (Thm.global_ctyp_of thy (TVar x)) thm
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    40
      val consts = params_of_sort context sort |>
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    41
        map (apsnd (map_type_tfree (fn ("'a", _) =>  tvar | x => TFree x)))
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    42
    in
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    43
      fold (fn c => Unoverloading.unoverload (Thm.global_cterm_of thy (Const c))) consts thm'
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    44
    end
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    45
  end
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    46
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    47
val tyN = (Args.context -- Args.typ) >>
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    48
  (fn (_, TFree (n, _)) => n
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    49
  | (ctxt, t) => error ("Not a type variable: " ^ Syntax.string_of_typ ctxt t))
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    50
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    51
fun unoverload_type_attr n = Thm.rule_attribute [] (fn context => unoverload_type context n)
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    52
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    53
val _ = Context.>> (Context.map_theory (Attrib.setup @{binding unoverload_type}
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    54
  (tyN >> unoverload_type_attr) "internalize a sort"))
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    55
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    56
end