src/HOL/Library/Phantom_Type.thy
author wenzelm
Fri Jan 04 23:22:53 2019 +0100 (10 months ago)
changeset 69593 3dda49e08b9d
parent 60500 903bb1495239
permissions -rw-r--r--
isabelle update -u control_cartouches;
     1 (*  Title:      HOL/Library/Phantom_Type.thy
     2     Author:     Andreas Lochbihler
     3 *)
     4 
     5 section \<open>A generic phantom type\<close>
     6 
     7 theory Phantom_Type
     8 imports Main
     9 begin
    10 
    11 datatype ('a, 'b) phantom = phantom (of_phantom: 'b)
    12 
    13 lemma type_definition_phantom': "type_definition of_phantom phantom UNIV"
    14 by(unfold_locales) simp_all
    15 
    16 lemma phantom_comp_of_phantom [simp]: "phantom \<circ> of_phantom = id"
    17   and of_phantom_comp_phantom [simp]: "of_phantom \<circ> phantom = id"
    18 by(simp_all add: o_def id_def)
    19 
    20 syntax "_Phantom" :: "type \<Rightarrow> logic" ("(1Phantom/(1'(_')))")
    21 translations
    22   "Phantom('t)" => "CONST phantom :: _ \<Rightarrow> ('t, _) phantom"
    23 
    24 typed_print_translation \<open>
    25   let
    26     fun phantom_tr' ctxt (Type (\<^type_name>\<open>fun\<close>, [_, Type (\<^type_name>\<open>phantom\<close>, [T, _])])) ts =
    27           list_comb
    28             (Syntax.const \<^syntax_const>\<open>_Phantom\<close> $ Syntax_Phases.term_of_typ ctxt T, ts)
    29       | phantom_tr' _ _ _ = raise Match;
    30   in [(\<^const_syntax>\<open>phantom\<close>, phantom_tr')] end
    31 \<close>
    32 
    33 lemma of_phantom_inject [simp]:
    34   "of_phantom x = of_phantom y \<longleftrightarrow> x = y"
    35 by(cases x y rule: phantom.exhaust[case_product phantom.exhaust]) simp
    36 
    37 end