src/HOL/Types_To_Sets/unoverload_type.ML
author wenzelm
Fri, 23 Nov 2018 16:43:11 +0100
changeset 69334 6b49700da068
parent 68438 f04d0e75e439
child 69597 ff784d5a5bfb
permissions -rw-r--r--
clarified font_domain: strict excludes e.g. space character;
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
68434
c6a38342376e allow for a list of vars
immler
parents: 68433
diff changeset
     9
  val unoverload_type: Context.generic -> indexname list -> thm -> thm
c6a38342376e allow for a list of vars
immler
parents: 68433
diff changeset
    10
  val unoverload_type_attr: indexname list -> attribute
68428
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
68429
38961724a017 workaround: in internalize_sort, Thm.unconstrainT can rename type variables and therefore invalidate new_tvar
immler
parents: 68428
diff changeset
    16
fun internalize_sort' ctvar thm =
38961724a017 workaround: in internalize_sort, Thm.unconstrainT can rename type variables and therefore invalidate new_tvar
immler
parents: 68428
diff changeset
    17
  let
38961724a017 workaround: in internalize_sort, Thm.unconstrainT can rename type variables and therefore invalidate new_tvar
immler
parents: 68428
diff changeset
    18
    val (_, thm') = Internalize_Sort.internalize_sort ctvar thm
38961724a017 workaround: in internalize_sort, Thm.unconstrainT can rename type variables and therefore invalidate new_tvar
immler
parents: 68428
diff changeset
    19
    val class_premise = case Thm.prems_of thm' of t::_=> t | [] =>
68430
immler
parents: 68429
diff changeset
    20
      raise THM ("internalize_sort': no premise?", 0, [thm'])
68429
38961724a017 workaround: in internalize_sort, Thm.unconstrainT can rename type variables and therefore invalidate new_tvar
immler
parents: 68428
diff changeset
    21
    val class_vars = Term.add_tvars class_premise []
38961724a017 workaround: in internalize_sort, Thm.unconstrainT can rename type variables and therefore invalidate new_tvar
immler
parents: 68428
diff changeset
    22
    val tvar = case class_vars of [x] => TVar x | _ =>
68430
immler
parents: 68429
diff changeset
    23
      raise TERM ("internalize_sort': not one type class variable.", [class_premise])
68429
38961724a017 workaround: in internalize_sort, Thm.unconstrainT can rename type variables and therefore invalidate new_tvar
immler
parents: 68428
diff changeset
    24
  in
38961724a017 workaround: in internalize_sort, Thm.unconstrainT can rename type variables and therefore invalidate new_tvar
immler
parents: 68428
diff changeset
    25
    (tvar, thm')
38961724a017 workaround: in internalize_sort, Thm.unconstrainT can rename type variables and therefore invalidate new_tvar
immler
parents: 68428
diff changeset
    26
  end
38961724a017 workaround: in internalize_sort, Thm.unconstrainT can rename type variables and therefore invalidate new_tvar
immler
parents: 68428
diff changeset
    27
68437
f9b15e7c12bd restructured
immler
parents: 68436
diff changeset
    28
fun params_of_class thy class = try (Axclass.get_info thy #> #params) class |> these
f9b15e7c12bd restructured
immler
parents: 68436
diff changeset
    29
f9b15e7c12bd restructured
immler
parents: 68436
diff changeset
    30
fun params_of_super_classes thy class =
f9b15e7c12bd restructured
immler
parents: 68436
diff changeset
    31
  Sorts.super_classes (Sign.classes_of thy) class |> maps (params_of_class thy)
f9b15e7c12bd restructured
immler
parents: 68436
diff changeset
    32
f9b15e7c12bd restructured
immler
parents: 68436
diff changeset
    33
fun params_of_sort thy sort = maps (params_of_super_classes thy) sort
f9b15e7c12bd restructured
immler
parents: 68436
diff changeset
    34
f9b15e7c12bd restructured
immler
parents: 68436
diff changeset
    35
fun subst_TFree n' ty' ty = map_type_tfree (fn x as (n, _) => if n = n' then ty' else TFree x) ty
f9b15e7c12bd restructured
immler
parents: 68436
diff changeset
    36
68434
c6a38342376e allow for a list of vars
immler
parents: 68433
diff changeset
    37
fun unoverload_single_type context x thm =
68428
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 tvars = Term.add_tvars (Thm.prop_of thm) []
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    40
    val thy = Context.theory_of context
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    41
  in
68433
f396f5490a8c parse var
immler
parents: 68430
diff changeset
    42
  case find_first (fn (y, _) => x = y) tvars of NONE =>
68438
f04d0e75e439 tuned exception
immler
parents: 68437
diff changeset
    43
    raise TYPE ("unoverload_type: no such type variable in theorem", [TVar (x,[])], [])
68428
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    44
  | SOME (x as (_, sort)) =>
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    45
    let
68429
38961724a017 workaround: in internalize_sort, Thm.unconstrainT can rename type variables and therefore invalidate new_tvar
immler
parents: 68428
diff changeset
    46
      val (tvar, thm') = internalize_sort' (Thm.global_ctyp_of thy (TVar x)) thm
68437
f9b15e7c12bd restructured
immler
parents: 68436
diff changeset
    47
      val consts = params_of_sort thy sort
f9b15e7c12bd restructured
immler
parents: 68436
diff changeset
    48
        |> map (apsnd (subst_TFree "'a" tvar) #> Const #> Thm.global_cterm_of thy)
68428
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    49
    in
68437
f9b15e7c12bd restructured
immler
parents: 68436
diff changeset
    50
      fold Unoverloading.unoverload consts thm'
68436
1b3edf5da4e4 result of unoverload is not in normal form
immler
parents: 68435
diff changeset
    51
      |> Raw_Simplifier.norm_hhf (Context.proof_of context)
68428
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    52
    end
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    53
  end
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    54
68434
c6a38342376e allow for a list of vars
immler
parents: 68433
diff changeset
    55
fun unoverload_type context xs = fold (unoverload_single_type context) xs
c6a38342376e allow for a list of vars
immler
parents: 68433
diff changeset
    56
c6a38342376e allow for a list of vars
immler
parents: 68433
diff changeset
    57
fun unoverload_type_attr xs = Thm.rule_attribute [] (fn context => unoverload_type context xs)
68428
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    58
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    59
val _ = Context.>> (Context.map_theory (Attrib.setup @{binding unoverload_type}
68435
immler
parents: 68434
diff changeset
    60
  (Scan.lift (Scan.repeat Args.var) >> unoverload_type_attr)
immler
parents: 68434
diff changeset
    61
    "internalize and unoverload type class parameters"))
68428
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    62
46beee72fb66 a derived rule combining unoverload and internalize_sort
immler
parents:
diff changeset
    63
end