src/HOL/Types_To_Sets/local_typedef.ML
author haftmann
Thu, 18 Jun 2020 09:07:30 +0000
changeset 71954 13bb3f5cdc5b
parent 69597 ff784d5a5bfb
child 77808 b43ee37926a9
permissions -rw-r--r--
pragmatically ruled out word types of length zero: a bit string with no bits is not bit string at all
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64551
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/Types_To_Sets/local_typedef.ML
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     2
    Author:     Ondřej Kunčar, TU München
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     3
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     4
The Local Typedef Rule (extension of the logic).
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     5
*)
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     6
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     7
signature LOCAL_TYPEDEF =
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     8
sig
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
     9
  val cancel_type_definition: thm -> thm
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    10
  val cancel_type_definition_attr: attribute
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    11
end;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    12
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    13
structure Local_Typedef : LOCAL_TYPEDEF =
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    14
struct
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    15
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    16
(*
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    17
Local Typedef Rule (LT)
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    18
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    19
  \<Gamma> \<turnstile> (\<exists>(Rep::\<beta> \<Rightarrow> \<tau>) Abs. type_definition Rep Abs A) \<Longrightarrow> \<phi>
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    20
------------------------------------------------------------- [\<beta> not in \<phi>, \<Gamma>, A;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    21
                       \<Gamma> \<turnstile> A \<noteq> \<emptyset> \<Longrightarrow> \<phi>                        sort(\<beta>)=HOL.type]
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    22
*)
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    23
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    24
(** BEGINNING OF THE CRITICAL CODE **)
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    25
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 64551
diff changeset
    26
fun dest_typedef (Const (\<^const_name>\<open>Ex\<close>, _) $ Abs (_, _,
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 64551
diff changeset
    27
      (Const (\<^const_name>\<open>Ex\<close>, _) $ Abs (_, Abs_type,
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 64551
diff changeset
    28
      (Const (\<^const_name>\<open>type_definition\<close>, _)) $ Bound 1 $ Bound 0 $ set)))) =
64551
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    29
    (Abs_type, set)
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    30
   | dest_typedef t = raise TERM ("dest_typedef", [t]);
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    31
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    32
fun cancel_type_definition_cterm thm =
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    33
  let
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    34
    fun err msg = raise THM ("cancel_type_definition: " ^ msg, 0, [thm]);
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    35
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    36
    val thy = Thm.theory_of_thm thm;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    37
    val prop = Thm.prop_of thm;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    38
    val hyps = Thm.hyps_of thm;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    39
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    40
    val _ = null (Thm.tpairs_of thm) orelse err "the theorem contains unsolved flex-flex pairs";
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    41
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    42
    val (typedef_assm, phi) = Logic.dest_implies prop
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    43
      handle TERM _ => err "the theorem is not an implication";
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    44
    val (abs_type, set) = typedef_assm |> HOLogic.dest_Trueprop |> dest_typedef
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    45
      handle TERM _ => err ("the assumption is not of the form "
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    46
        ^ quote "\<exists>Rep Abs. type_definition Rep Abs A");
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    47
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    48
    val (repT, absT) = Term.dest_funT abs_type;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    49
    val _ = Term.is_TVar absT orelse err "the abstract type is not a schematic type variable";
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    50
    val (absT_name, sorts) = Term.dest_TVar absT;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    51
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    52
    val typeS = Sign.defaultS thy;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    53
    val _ = sorts = typeS orelse err ("the type " ^ quote (fst absT_name) ^ " is not of the sort "
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    54
      ^ quote (Syntax.string_of_sort_global thy typeS));
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    55
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    56
    fun contains_absT tm = member (op=) (Term.add_tvars tm []) (absT_name, sorts);
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    57
    fun err_contains_absT_in msg = err (msg ^ " contains the forbidden type "
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    58
      ^ quote (fst absT_name));
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    59
    val _ = not (contains_absT phi) orelse err_contains_absT_in "the conclusion";
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    60
    val _ = not (contains_absT set) orelse err_contains_absT_in "the set term";
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    61
    (* the following test is superfluous; the meta hypotheses cannot currently contain TVars *)
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    62
    val _ = not (exists contains_absT hyps) orelse err_contains_absT_in "one of the hypotheses";
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    63
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    64
    val not_empty_assm = HOLogic.mk_Trueprop
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    65
      (HOLogic.mk_not (HOLogic.mk_eq (set, HOLogic.mk_set repT [])));
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    66
    val prop = Logic.list_implies (hyps @ [not_empty_assm], phi);
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    67
  in
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    68
    Thm.global_cterm_of thy prop |> Thm.weaken_sorts (Thm.shyps_of thm)
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    69
  end;
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    70
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    71
(** END OF THE CRITICAL CODE **)
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    72
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    73
val (_, cancel_type_definition_oracle) = Context.>>> (Context.map_theory_result
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 64551
diff changeset
    74
  (Thm.add_oracle (\<^binding>\<open>cancel_type_definition\<close>, cancel_type_definition_cterm)));
64551
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    75
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    76
fun cancel_type_definition thm =
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    77
  Drule.implies_elim_list (cancel_type_definition_oracle thm) (map Thm.assume (Thm.chyps_of thm));
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    78
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    79
val cancel_type_definition_attr = Thm.rule_attribute [] (K cancel_type_definition);
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    80
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 64551
diff changeset
    81
val _ = Context.>> (Context.map_theory (Attrib.setup \<^binding>\<open>cancel_type_definition\<close>
64551
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    82
  (Scan.succeed cancel_type_definition_attr) "cancel a local type definition"));
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    83
79e9587dbcca proper session HOL-Types_To_Sets;
wenzelm
parents:
diff changeset
    84
end;