src/HOL/Tools/Lifting/lifting_setup.ML
author kuncar
Wed, 04 Apr 2012 17:51:12 +0200
changeset 47361 87c0eaf04bad
parent 47352 e0bff2ae939f
child 47379 075d22b3a32f
permissions -rw-r--r--
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
     1
(*  Title:      HOL/Tools/Lifting/lifting_setup.ML
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
     2
    Author:     Ondrej Kuncar
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
     3
47352
e0bff2ae939f fix typos
huffman
parents: 47334
diff changeset
     4
Setting up the lifting infrastructure.
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
     5
*)
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
     6
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
     7
signature LIFTING_SETUP =
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
     8
sig
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
     9
  exception SETUP_LIFTING_INFR of string
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    10
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    11
  val setup_lifting_infr: thm -> thm -> local_theory -> local_theory
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    12
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    13
  val setup_by_typedef_thm: thm -> local_theory -> local_theory
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    14
end;
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    15
47334
4708384e759d fix typo in ML structure name
huffman
parents: 47308
diff changeset
    16
structure Lifting_Setup: LIFTING_SETUP =
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    17
struct
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    18
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    19
infix 0 MRSL
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    20
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    21
fun ants MRSL thm = fold (fn rl => fn thm => rl RS thm) ants thm
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    22
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    23
exception SETUP_LIFTING_INFR of string
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    24
47361
87c0eaf04bad support non-open typedefs; define cr_rel in terms of a rep function for typedefs
kuncar
parents: 47352
diff changeset
    25
fun define_cr_rel rep_fun lthy =
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    26
  let
47361
87c0eaf04bad support non-open typedefs; define cr_rel in terms of a rep function for typedefs
kuncar
parents: 47352
diff changeset
    27
    val (qty, rty) = (dest_funT o fastype_of) rep_fun
87c0eaf04bad support non-open typedefs; define cr_rel in terms of a rep function for typedefs
kuncar
parents: 47352
diff changeset
    28
    val rep_fun_graph = (HOLogic.eq_const rty) $ Bound 1 $ (rep_fun $ Bound 0)
87c0eaf04bad support non-open typedefs; define cr_rel in terms of a rep function for typedefs
kuncar
parents: 47352
diff changeset
    29
    val def_term = Abs ("x", rty, Abs ("y", qty, rep_fun_graph));
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    30
    val qty_name = (fst o dest_Type) qty
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    31
    val cr_rel_name = Binding.prefix_name "cr_" (Binding.qualified_name qty_name)  
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    32
    val (fixed_def_term, lthy') = yield_singleton (Variable.importT_terms) def_term lthy
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    33
    val ((_, (_ , def_thm)), lthy'') =
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    34
      Local_Theory.define ((cr_rel_name, NoSyn), ((Thm.def_binding cr_rel_name, []), fixed_def_term)) lthy'
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    35
  in
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    36
    (def_thm, lthy'')
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    37
  end
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    38
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    39
fun define_abs_type quot_thm lthy =
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    40
  if Lifting_Def.can_generate_code_cert quot_thm then
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    41
    let
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    42
      val abs_type_thm = quot_thm RS @{thm Quotient_abs_rep}
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    43
      val add_abstype_attribute = 
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    44
          Thm.declaration_attribute (fn thm => Context.mapping (Code.add_abstype thm) I)
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    45
        val add_abstype_attrib = Attrib.internal (K add_abstype_attribute);
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    46
    in
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    47
      lthy
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    48
        |> (snd oo Local_Theory.note) ((Binding.empty, [add_abstype_attrib]), [abs_type_thm])
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    49
    end
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    50
  else
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    51
    lthy
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    52
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    53
fun setup_lifting_infr quot_thm equiv_thm lthy =
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    54
  let
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    55
    val (_, qtyp) = Lifting_Term.quot_thm_rty_qty quot_thm
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    56
    val qty_full_name = (fst o dest_Type) qtyp
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    57
    val quotients = { quot_thm = quot_thm }
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    58
    fun quot_info phi = Lifting_Info.transform_quotients phi quotients
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    59
  in
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    60
    lthy
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    61
      |> Local_Theory.declaration {syntax = false, pervasive = true}
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    62
        (fn phi => Lifting_Info.update_quotients qty_full_name (quot_info phi))
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    63
      |> define_abs_type quot_thm
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    64
  end
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    65
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    66
fun setup_by_typedef_thm typedef_thm lthy =
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    67
  let
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    68
    fun derive_quot_and_equiv_thm to_quot_thm to_equiv_thm typedef_thm lthy =
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    69
      let
47361
87c0eaf04bad support non-open typedefs; define cr_rel in terms of a rep function for typedefs
kuncar
parents: 47352
diff changeset
    70
        val (_ $ rep_fun $ _ $ _) = (HOLogic.dest_Trueprop o prop_of) typedef_thm
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    71
        val equiv_thm = typedef_thm RS to_equiv_thm
47361
87c0eaf04bad support non-open typedefs; define cr_rel in terms of a rep function for typedefs
kuncar
parents: 47352
diff changeset
    72
        val (T_def, lthy') = define_cr_rel rep_fun lthy
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    73
        val quot_thm =  [typedef_thm, T_def] MRSL to_quot_thm
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    74
      in
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    75
        (quot_thm, equiv_thm, lthy')
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    76
      end
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    77
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    78
    val typedef_set = (snd o dest_comb o HOLogic.dest_Trueprop o prop_of) typedef_thm
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    79
    val (quot_thm, equiv_thm, lthy') = (case typedef_set of
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    80
      Const ("Orderings.top_class.top", _) => 
47361
87c0eaf04bad support non-open typedefs; define cr_rel in terms of a rep function for typedefs
kuncar
parents: 47352
diff changeset
    81
        derive_quot_and_equiv_thm @{thm UNIV_typedef_to_Quotient} @{thm UNIV_typedef_to_equivp} 
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    82
          typedef_thm lthy
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    83
      | Const (@{const_name "Collect"}, _) $ Abs (_, _, _) => 
47361
87c0eaf04bad support non-open typedefs; define cr_rel in terms of a rep function for typedefs
kuncar
parents: 47352
diff changeset
    84
        derive_quot_and_equiv_thm @{thm open_typedef_to_Quotient} @{thm open_typedef_to_part_equivp} 
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    85
          typedef_thm lthy
47361
87c0eaf04bad support non-open typedefs; define cr_rel in terms of a rep function for typedefs
kuncar
parents: 47352
diff changeset
    86
      | _ => derive_quot_and_equiv_thm @{thm typedef_to_Quotient} @{thm typedef_to_part_equivp} 
87c0eaf04bad support non-open typedefs; define cr_rel in terms of a rep function for typedefs
kuncar
parents: 47352
diff changeset
    87
          typedef_thm lthy)
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    88
  in
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    89
    setup_lifting_infr quot_thm equiv_thm lthy'
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    90
  end
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    91
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    92
fun setup_by_typedef_thm_aux xthm lthy = setup_by_typedef_thm (singleton (Attrib.eval_thms lthy) xthm) lthy
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    93
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    94
val _ = 
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    95
  Outer_Syntax.local_theory @{command_spec "setup_lifting"}
47352
e0bff2ae939f fix typos
huffman
parents: 47334
diff changeset
    96
    "Setup lifting infrastructure" 
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    97
      (Parse_Spec.xthm >> (fn xthm => setup_by_typedef_thm_aux xthm))
9caab698dbe4 new package Lifting - initial commit
kuncar
parents:
diff changeset
    98
end;