src/HOL/Types_To_Sets/unoverload_def.ML
author nipkow
Fri, 11 Dec 2020 17:58:01 +0100
changeset 72884 50f18a822ee9
parent 69689 ab5a8a2519b0
child 79336 032a31db4c6f
permissions -rw-r--r--
merged
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69689
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
     1
(*  Title:      HOL/Types_To_Sets/unoverload_def.ML
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
     2
    Author:     Fabian Immler, CMU
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
     3
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
     4
Define unoverloaded constants from overloaded definitions.
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
     5
*)
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
     6
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
     7
structure Unoverload_Def = struct
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
     8
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
     9
fun unoverload_def name_opt thm thy =
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    10
  let
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    11
    val ctxt = Proof_Context.init_global thy
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    12
    val thm_abs = Local_Defs.abs_def_rule ctxt thm
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    13
      |> Conv.fconv_rule (Conv.top_conv
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    14
        (K (Conv.try_conv (Conv.rewrs_conv
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    15
              (Named_Theorems.get ctxt @{named_theorems unoverload_def})))) ctxt)
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    16
    val (lhs, rhs) = thm_abs
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    17
      |> Thm.cprop_of
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    18
      |> Thm.dest_equals
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    19
    val c = lhs |> Thm.term_of |> Term.dest_Const
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    20
    val binding_with =
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    21
      case name_opt of NONE =>
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    22
        Binding.qualify_name true
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    23
          (Binding.name (Binding.name_of (Binding.qualified_name (#1 c))))
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    24
          "with"
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    25
      | SOME name => name
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    26
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    27
    val tvars = Term.add_tvars (Thm.term_of rhs) [] |> map fst
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    28
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    29
    val thm_with = Thm.reflexive rhs
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    30
      |> Unoverload_Type.unoverload_type (Context.Proof ctxt) (tvars)
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    31
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    32
    val rhs_with' = thm_with |> Thm.cconcl_of |> Thm.dest_equals |> #2 |> Thm.term_of
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    33
    val vars = Term.add_vars rhs_with' []
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    34
    val rhs_abs = fold (Var #> Term.lambda) vars rhs_with'
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    35
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    36
    val ([rhs_abs'], ctxt') = Variable.importT_terms [rhs_abs] ctxt
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    37
    val (with_const, thy') = Sign.declare_const_global
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    38
      ((binding_with, Term.fastype_of rhs_abs'), NoSyn)
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    39
      thy
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    40
    val ([with_def], thy'') = Global_Theory.add_defs false
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    41
      [((Binding.suffix_name "_def" binding_with,
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    42
      Logic.mk_equals (with_const, rhs_abs')), [])] thy'
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    43
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    44
    val with_var_def =
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    45
      fold_rev
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    46
        (fn (x, _) => fn thm =>
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    47
          let
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    48
            val ty = Thm.concl_of thm |> Logic.dest_equals |> #2 |>
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    49
              fastype_of |> dest_funT |> #1
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    50
          in
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    51
            Thm.combination thm
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    52
              (Thm.reflexive (Thm.var (x, Thm.ctyp_of (Proof_Context.init_global thy'') ty)))
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    53
          end)
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    54
        (vars)
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    55
        (with_def)
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    56
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    57
    val thm_with = ([thm_abs, Thm.symmetric with_var_def] MRS @{thm Pure.transitive})
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    58
    val thy''' =
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    59
      Global_Theory.add_thm
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    60
        ((binding_with, thm_with), [Named_Theorems.add @{named_theorems "unoverload_def"}]) thy''
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    61
      |> #2
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    62
  in thy''' end
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    63
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    64
fun unoverload_def1_cmd (name_opt, facts) thy =
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    65
  let
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    66
    val [thm] = Attrib.eval_thms (Proof_Context.init_global thy) [facts]
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    67
  in unoverload_def name_opt thm thy end
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    68
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    69
val _ =
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    70
  Outer_Syntax.local_theory \<^command_keyword>\<open>unoverload_definition\<close>
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    71
    "definition of unoverloaded constants"
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    72
    (Parse.and_list (Scan.option (Parse.binding --| \<^keyword>\<open>:\<close>) -- Parse.thm) >>
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    73
      (fn things => Local_Theory.raw_theory (fold unoverload_def1_cmd things))
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    74
    )
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    75
ab5a8a2519b0 automation for unverloading definitions
immler
parents:
diff changeset
    76
end