src/HOL/Tools/Lifting/lifting_setup.ML
author huffman
Wed, 04 Apr 2012 11:50:08 +0200
changeset 48210 e0bff2ae939f
parent 48205 4708384e759d
child 48219 87c0eaf04bad
permissions -rw-r--r--
fix typos
kuncar@48153
     1
(*  Title:      HOL/Tools/Lifting/lifting_setup.ML
kuncar@48153
     2
    Author:     Ondrej Kuncar
kuncar@48153
     3
huffman@48210
     4
Setting up the lifting infrastructure.
kuncar@48153
     5
*)
kuncar@48153
     6
kuncar@48153
     7
signature LIFTING_SETUP =
kuncar@48153
     8
sig
kuncar@48153
     9
  exception SETUP_LIFTING_INFR of string
kuncar@48153
    10
kuncar@48153
    11
  val setup_lifting_infr: thm -> thm -> local_theory -> local_theory
kuncar@48153
    12
kuncar@48153
    13
  val setup_by_typedef_thm: thm -> local_theory -> local_theory
kuncar@48153
    14
end;
kuncar@48153
    15
huffman@48205
    16
structure Lifting_Setup: LIFTING_SETUP =
kuncar@48153
    17
struct
kuncar@48153
    18
kuncar@48153
    19
infix 0 MRSL
kuncar@48153
    20
kuncar@48153
    21
fun ants MRSL thm = fold (fn rl => fn thm => rl RS thm) ants thm
kuncar@48153
    22
kuncar@48153
    23
exception SETUP_LIFTING_INFR of string
kuncar@48153
    24
kuncar@48153
    25
fun define_cr_rel equiv_thm abs_fun lthy =
kuncar@48153
    26
  let
kuncar@48153
    27
    fun force_type_of_rel rel forced_ty =
kuncar@48153
    28
      let
kuncar@48153
    29
        val thy = Proof_Context.theory_of lthy
kuncar@48153
    30
        val rel_ty = (domain_type o fastype_of) rel
kuncar@48153
    31
        val ty_inst = Sign.typ_match thy (rel_ty, forced_ty) Vartab.empty
kuncar@48153
    32
      in
kuncar@48153
    33
        Envir.subst_term_types ty_inst rel
kuncar@48153
    34
      end
kuncar@48153
    35
kuncar@48153
    36
    val (rty, qty) = (dest_funT o fastype_of) abs_fun
kuncar@48153
    37
    val abs_fun_graph = HOLogic.mk_eq(abs_fun $ Bound 1, Bound 0)
kuncar@48153
    38
    val Abs_body = (case (HOLogic.dest_Trueprop o prop_of) equiv_thm of
kuncar@48153
    39
      Const (@{const_name equivp}, _) $ _ => abs_fun_graph
kuncar@48153
    40
      | Const (@{const_name part_equivp}, _) $ rel => 
kuncar@48153
    41
        HOLogic.mk_conj (force_type_of_rel rel rty $ Bound 1 $ Bound 1, abs_fun_graph)
huffman@48210
    42
      | _ => raise SETUP_LIFTING_INFR "unsupported equivalence theorem"
kuncar@48153
    43
      )
kuncar@48153
    44
    val def_term = Abs ("x", rty, Abs ("y", qty, Abs_body));
kuncar@48153
    45
    val qty_name = (fst o dest_Type) qty
kuncar@48153
    46
    val cr_rel_name = Binding.prefix_name "cr_" (Binding.qualified_name qty_name)  
kuncar@48153
    47
    val (fixed_def_term, lthy') = yield_singleton (Variable.importT_terms) def_term lthy
kuncar@48153
    48
    val ((_, (_ , def_thm)), lthy'') =
kuncar@48153
    49
      Local_Theory.define ((cr_rel_name, NoSyn), ((Thm.def_binding cr_rel_name, []), fixed_def_term)) lthy'
kuncar@48153
    50
  in
kuncar@48153
    51
    (def_thm, lthy'')
kuncar@48153
    52
  end
kuncar@48153
    53
kuncar@48153
    54
fun define_abs_type quot_thm lthy =
kuncar@48153
    55
  if Lifting_Def.can_generate_code_cert quot_thm then
kuncar@48153
    56
    let
kuncar@48153
    57
      val abs_type_thm = quot_thm RS @{thm Quotient_abs_rep}
kuncar@48153
    58
      val add_abstype_attribute = 
kuncar@48153
    59
          Thm.declaration_attribute (fn thm => Context.mapping (Code.add_abstype thm) I)
kuncar@48153
    60
        val add_abstype_attrib = Attrib.internal (K add_abstype_attribute);
kuncar@48153
    61
    in
kuncar@48153
    62
      lthy
kuncar@48153
    63
        |> (snd oo Local_Theory.note) ((Binding.empty, [add_abstype_attrib]), [abs_type_thm])
kuncar@48153
    64
    end
kuncar@48153
    65
  else
kuncar@48153
    66
    lthy
kuncar@48153
    67
kuncar@48153
    68
fun setup_lifting_infr quot_thm equiv_thm lthy =
kuncar@48153
    69
  let
kuncar@48153
    70
    val (_, qtyp) = Lifting_Term.quot_thm_rty_qty quot_thm
kuncar@48153
    71
    val qty_full_name = (fst o dest_Type) qtyp
kuncar@48153
    72
    val quotients = { quot_thm = quot_thm }
kuncar@48153
    73
    fun quot_info phi = Lifting_Info.transform_quotients phi quotients
kuncar@48153
    74
  in
kuncar@48153
    75
    lthy
kuncar@48153
    76
      |> Local_Theory.declaration {syntax = false, pervasive = true}
kuncar@48153
    77
        (fn phi => Lifting_Info.update_quotients qty_full_name (quot_info phi))
kuncar@48153
    78
      |> define_abs_type quot_thm
kuncar@48153
    79
  end
kuncar@48153
    80
kuncar@48153
    81
fun setup_by_typedef_thm typedef_thm lthy =
kuncar@48153
    82
  let
kuncar@48153
    83
    fun derive_quot_and_equiv_thm to_quot_thm to_equiv_thm typedef_thm lthy =
kuncar@48153
    84
      let
kuncar@48153
    85
        val (_ $ _ $ abs_fun $ _) = (HOLogic.dest_Trueprop o prop_of) typedef_thm
kuncar@48153
    86
        val equiv_thm = typedef_thm RS to_equiv_thm
kuncar@48153
    87
        val (T_def, lthy') = define_cr_rel equiv_thm abs_fun lthy
kuncar@48153
    88
        val quot_thm =  [typedef_thm, T_def] MRSL to_quot_thm
kuncar@48153
    89
      in
kuncar@48153
    90
        (quot_thm, equiv_thm, lthy')
kuncar@48153
    91
      end
kuncar@48153
    92
kuncar@48153
    93
    val typedef_set = (snd o dest_comb o HOLogic.dest_Trueprop o prop_of) typedef_thm
kuncar@48153
    94
    val (quot_thm, equiv_thm, lthy') = (case typedef_set of
kuncar@48153
    95
      Const ("Orderings.top_class.top", _) => 
kuncar@48153
    96
        derive_quot_and_equiv_thm @{thm copy_type_to_Quotient} @{thm copy_type_to_equivp} 
kuncar@48153
    97
          typedef_thm lthy
kuncar@48153
    98
      | Const (@{const_name "Collect"}, _) $ Abs (_, _, _) => 
kuncar@48153
    99
        derive_quot_and_equiv_thm @{thm invariant_type_to_Quotient} @{thm invariant_type_to_part_equivp} 
kuncar@48153
   100
          typedef_thm lthy
kuncar@48153
   101
      | _ => raise SETUP_LIFTING_INFR "unsupported typedef theorem")
kuncar@48153
   102
  in
kuncar@48153
   103
    setup_lifting_infr quot_thm equiv_thm lthy'
kuncar@48153
   104
  end
kuncar@48153
   105
kuncar@48153
   106
fun setup_by_typedef_thm_aux xthm lthy = setup_by_typedef_thm (singleton (Attrib.eval_thms lthy) xthm) lthy
kuncar@48153
   107
kuncar@48153
   108
val _ = 
kuncar@48153
   109
  Outer_Syntax.local_theory @{command_spec "setup_lifting"}
huffman@48210
   110
    "Setup lifting infrastructure" 
kuncar@48153
   111
      (Parse_Spec.xthm >> (fn xthm => setup_by_typedef_thm_aux xthm))
kuncar@48153
   112
kuncar@48153
   113
end;