# Theory Type

Up to index of Isabelle/HOL/Bali

theory Type
imports Name
begin

    (*  Title:      HOL/Bali/Type.thy
        ID:         $Id: Type.thy,v 1.8 2005/06/17 14:13:06 haftmann Exp $
        Author:     David von Oheimb
    *)

    header {* Java types *}

    theory Type imports Name begin

    text {*
    simplifications:
    \begin{itemize}
    \item only the most important primitive types
    \item the null type is regarded as reference type
    \end{itemize}
    *}

    datatype prim_ty        --{* primitive type, cf. 4.2 *}
            = Void          --{* result type of void methods *}
            | Boolean
            | Integer

    datatype ref_ty         --{* reference type, cf. 4.3 *}
            = NullT         --{* null type, cf. 4.1 *}
            | IfaceT qtname --{* interface type *}
            | ClassT qtname --{* class type *}
            | ArrayT ty     --{* array type *}

    and ty                  --{* any type, cf. 4.1 *}
            = PrimT prim_ty --{* primitive type *}
            | RefT  ref_ty  --{* reference type *}

    translations
      "prim_ty" <= (type) "Type.prim_ty"
      "ref_ty"  <= (type) "Type.ref_ty"
      "ty"      <= (type) "Type.ty"

    syntax
             NT     :: "          ty"
             Iface  :: "qtname  => ty"
             Class  :: "qtname  => ty"
             Array  :: "ty     => ty"    ("_.[]" [90] 90)

    translations
            "NT"      == "RefT   NullT"
            "Iface I" == "RefT (IfaceT I)"
            "Class C" == "RefT (ClassT C)"
            "T.[]"    == "RefT (ArrayT T)"

    constdefs
      the_Class :: "ty => qtname"
     "the_Class T ≡ SOME C. T = Class C" (** primrec not possible here **)

    lemma the_Class_eq [simp]: "the_Class (Class C)= C"
    by (auto simp add: the_Class_def)

    end

lemma the_Class_eq:

      the_Class (Class C) = C