# HG changeset patch # User haftmann # Date 1174375635 -3600 # Node ID 753123c89d721298c3e463a051e8199b8f083ebc # Parent bfd9c0fd70b1e88900b1a606a3f88a97a4b8f40f explizit "type" superclass diff -r bfd9c0fd70b1 -r 753123c89d72 doc-src/IsarAdvanced/Classes/Thy/Classes.thy --- a/doc-src/IsarAdvanced/Classes/Thy/Classes.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/doc-src/IsarAdvanced/Classes/Thy/Classes.thy Tue Mar 20 08:27:15 2007 +0100 @@ -161,7 +161,7 @@ assumed to be associative: *} - class semigroup = + class semigroup = type + fixes mult :: "\ \ \ \ \" (infixl "\<^loc>\" 70) assumes assoc: "(x \<^loc>\ y) \<^loc>\ z = x \<^loc>\ (y \<^loc>\ z)" @@ -333,7 +333,7 @@ is nothing else than a locale: *} -class idem = +class idem = type + fixes f :: "\ \ \" assumes idem: "f (f x) = f x" diff -r bfd9c0fd70b1 -r 753123c89d72 doc-src/IsarAdvanced/Codegen/Thy/Codegen.thy --- a/doc-src/IsarAdvanced/Codegen/Thy/Codegen.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/doc-src/IsarAdvanced/Codegen/Thy/Codegen.thy Tue Mar 20 08:27:15 2007 +0100 @@ -141,12 +141,10 @@ most cases code generation proceeds without further ado: *} -consts - fac :: "nat \ nat" - -primrec - "fac 0 = 1" - "fac (Suc n) = Suc n * fac n" +fun + fac :: "nat \ nat" where + "fac 0 = 1" + | "fac (Suc n) = Suc n * fac n" text {* This executable specification is now turned to SML code: @@ -324,7 +322,7 @@ assigning to each of its inhabitants a \qt{null} value: *} -class null = +class null = type + fixes null :: 'a consts @@ -551,9 +549,6 @@ fun in_interval :: "nat \ nat \ nat \ bool" where "in_interval (k, l) n \ k \ n \ n \ l" -(*<*) -declare in_interval.simps [code func] -(*>*) (*<*) code_type %tt bool @@ -716,15 +711,12 @@ fun collect_duplicates :: "'a list \ 'a list \ 'a list \ 'a list" where - "collect_duplicates xs ys [] = xs" - "collect_duplicates xs ys (z#zs) = (if z \ set xs - then if z \ set ys - then collect_duplicates xs ys zs - else collect_duplicates xs (z#ys) zs - else collect_duplicates (z#xs) (z#ys) zs)" -(*<*) -lemmas [code func] = collect_duplicates.simps -(*>*) + "collect_duplicates xs ys [] = xs" + | "collect_duplicates xs ys (z#zs) = (if z \ set xs + then if z \ set ys + then collect_duplicates xs ys zs + else collect_duplicates xs (z#ys) zs + else collect_duplicates (z#xs) (z#ys) zs)" text {* The membership test during preprocessing is rewritten, @@ -749,7 +741,7 @@ consts "op =" :: "'a" (*>*) -class eq (attach "op =") = notes reflexive +class eq (attach "op =") = type text {* This merely introduces a class @{text eq} with corresponding @@ -782,11 +774,8 @@ fun lookup :: "(key \ 'a) list \ key \ 'a option" where - "lookup [] l = None" - "lookup ((k, v) # xs) l = (if k = l then Some v else lookup xs l)" -(*<*) -lemmas [code func] = lookup.simps -(*>*) + "lookup [] l = None" + | "lookup ((k, v) # xs) l = (if k = l then Some v else lookup xs l)" code_type %tt key (SML "string") @@ -883,7 +872,7 @@ (*<*) setup {* Sign.add_path "bar" *} -class eq = fixes eq :: "'a \ 'a \ bool" +class eq = type + fixes eq :: "'a \ 'a \ bool" (*>*) code_class %tt eq @@ -1091,11 +1080,8 @@ fun dummy_option :: "'a list \ 'a option" where - "dummy_option (x#xs) = Some x" - "dummy_option [] = arbitrary" -(*<*) -declare dummy_option.simps [code func] -(*>*) + "dummy_option (x#xs) = Some x" + | "dummy_option [] = arbitrary" code_gen dummy_option (*<*)(SML #)(*>*)(SML "examples/arbitrary.ML") diff -r bfd9c0fd70b1 -r 753123c89d72 src/HOL/Code_Generator.thy --- a/src/HOL/Code_Generator.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/src/HOL/Code_Generator.thy Tue Mar 20 08:27:15 2007 +0100 @@ -75,7 +75,7 @@ text {* operational equality for code generation *} -class eq (attach "op =") = notes reflexive +class eq (attach "op =") = type text {* equality for Haskell *} diff -r bfd9c0fd70b1 -r 753123c89d72 src/HOL/Divides.thy --- a/src/HOL/Divides.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/src/HOL/Divides.thy Tue Mar 20 08:27:15 2007 +0100 @@ -12,7 +12,7 @@ (*We use the same class for div and mod; moreover, dvd is defined whenever multiplication is*) -class div = +class div = type + fixes div :: "'a \ 'a \ 'a" fixes mod :: "'a \ 'a \ 'a" begin diff -r bfd9c0fd70b1 -r 753123c89d72 src/HOL/Finite_Set.thy --- a/src/HOL/Finite_Set.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/src/HOL/Finite_Set.thy Tue Mar 20 08:27:15 2007 +0100 @@ -2533,7 +2533,7 @@ subsection {* Class @{text finite} *} -class finite (attach UNIV) = +class finite (attach UNIV) = type + assumes finite: "finite UNIV" lemma finite_set: "finite (A::'a::finite set)" diff -r bfd9c0fd70b1 -r 753123c89d72 src/HOL/HOL.thy --- a/src/HOL/HOL.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/src/HOL/HOL.thy Tue Mar 20 08:27:15 2007 +0100 @@ -179,26 +179,26 @@ subsubsection {* Generic algebraic operations *} -class zero = +class zero = type + fixes zero :: "'a" ("\<^loc>0") -class one = +class one = type + fixes one :: "'a" ("\<^loc>1") hide (open) const zero one -class plus = +class plus = type + fixes plus :: "'a \ 'a \ 'a" (infixl "\<^loc>+" 65) -class minus = +class minus = type + fixes uminus :: "'a \ 'a" and minus :: "'a \ 'a \ 'a" (infixl "\<^loc>-" 65) and abs :: "'a \ 'a" -class times = +class times = type + fixes times :: "'a \ 'a \ 'a" (infixl "\<^loc>*" 70) -class inverse = +class inverse = type + fixes inverse :: "'a \ 'a" and divide :: "'a \ 'a \ 'a" (infixl "\<^loc>'/" 70) diff -r bfd9c0fd70b1 -r 753123c89d72 src/HOL/Integ/Numeral.thy --- a/src/HOL/Integ/Numeral.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/src/HOL/Integ/Numeral.thy Tue Mar 20 08:27:15 2007 +0100 @@ -42,7 +42,7 @@ Bit :: "int \ bit \ int" (infixl "BIT" 90) where "k BIT b = (case b of B0 \ 0 | B1 \ 1) + k + k" -class number = -- {* for numeric types: nat, int, real, \dots *} +class number = type + -- {* for numeric types: nat, int, real, \dots *} fixes number_of :: "int \ 'a" syntax diff -r bfd9c0fd70b1 -r 753123c89d72 src/HOL/Library/Kleene_Algebras.thy --- a/src/HOL/Library/Kleene_Algebras.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/src/HOL/Library/Kleene_Algebras.thy Tue Mar 20 08:27:15 2007 +0100 @@ -9,7 +9,7 @@ text {* A type class of kleene algebras *} -class star = +class star = type + fixes star :: "'a \ 'a" class idem_add = ab_semigroup_add + diff -r bfd9c0fd70b1 -r 753123c89d72 src/HOL/Library/Parity.thy --- a/src/HOL/Library/Parity.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/src/HOL/Library/Parity.thy Tue Mar 20 08:27:15 2007 +0100 @@ -9,7 +9,7 @@ imports Main begin -class even_odd = +class even_odd = type + fixes even :: "'a \ bool" abbreviation diff -r bfd9c0fd70b1 -r 753123c89d72 src/HOL/Library/Quotient.thy --- a/src/HOL/Library/Quotient.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/src/HOL/Library/Quotient.thy Tue Mar 20 08:27:15 2007 +0100 @@ -21,7 +21,7 @@ "\ :: 'a => 'a => bool"}. *} -class eqv = +class eqv = type + fixes eqv :: "'a \ 'a \ bool" (infixl "\<^loc>\" 50) class equiv = eqv + diff -r bfd9c0fd70b1 -r 753123c89d72 src/HOL/Nat.thy --- a/src/HOL/Nat.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/src/HOL/Nat.thy Tue Mar 20 08:27:15 2007 +0100 @@ -106,7 +106,7 @@ text {* size of a datatype value *} -class size = +class size = type + fixes size :: "'a \ nat" text {* @{typ nat} is a datatype *} @@ -476,7 +476,7 @@ subsection {* Arithmetic operators *} -class power = +class power = type + fixes power :: "'a \ nat \ 'a" (infixr "\<^loc>^" 80) text {* arithmetic operators @{text "+ -"} and @{text "*"} *} diff -r bfd9c0fd70b1 -r 753123c89d72 src/HOL/Orderings.thy --- a/src/HOL/Orderings.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/src/HOL/Orderings.thy Tue Mar 20 08:27:15 2007 +0100 @@ -11,7 +11,7 @@ subsection {* Order syntax *} -class ord = +class ord = type + fixes less_eq :: "'a \ 'a \ bool" (infix "\" 50) and less :: "'a \ 'a \ bool" (infix "\" 50) begin diff -r bfd9c0fd70b1 -r 753123c89d72 src/HOL/ex/Classpackage.thy --- a/src/HOL/ex/Classpackage.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/src/HOL/ex/Classpackage.thy Tue Mar 20 08:27:15 2007 +0100 @@ -8,7 +8,7 @@ imports Main begin -class semigroup = +class semigroup = type + fixes mult :: "'a \ 'a \ 'a" (infixl "\<^loc>\" 70) assumes assoc: "x \<^loc>\ y \<^loc>\ z = x \<^loc>\ (y \<^loc>\ z)" diff -r bfd9c0fd70b1 -r 753123c89d72 src/HOL/ex/CodeCollections.thy --- a/src/HOL/ex/CodeCollections.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/src/HOL/ex/CodeCollections.thy Tue Mar 20 08:27:15 2007 +0100 @@ -74,7 +74,7 @@ "list_ex P xs \ (\x\set xs. P x)" by (induct xs) auto -class finite = +class finite = type + fixes fin :: "'a list" assumes member_fin: "x \ set fin" begin diff -r bfd9c0fd70b1 -r 753123c89d72 src/HOL/ex/CodeEval.thy --- a/src/HOL/ex/CodeEval.thy Mon Mar 19 19:28:27 2007 +0100 +++ b/src/HOL/ex/CodeEval.thy Tue Mar 20 08:27:15 2007 +0100 @@ -10,7 +10,7 @@ subsection {* The typ_of class *} -class typ_of = +class typ_of = type + fixes typ_of :: "'a itself \ typ" ML {* diff -r bfd9c0fd70b1 -r 753123c89d72 src/Pure/Tools/class_package.ML --- a/src/Pure/Tools/class_package.ML Mon Mar 19 19:28:27 2007 +0100 +++ b/src/Pure/Tools/class_package.ML Tue Mar 20 08:27:15 2007 +0100 @@ -417,13 +417,8 @@ local -fun certify_class thy class = - tap (the_class_data thy) (Sign.certify_class thy class); - -fun read_class thy = - certify_class thy o Sign.intern_class thy; - -fun gen_class add_locale prep_class prep_param bname raw_supclasses raw_elems raw_other_consts thy = +fun gen_class add_locale prep_class prep_param bname + raw_supclasses raw_elems raw_other_consts thy = let (*FIXME need proper concept for reading locale statements*) fun subst_classtyvar (_, _) = @@ -436,25 +431,27 @@ val (elems, includes) = fold_rev (fn Locale.Elem e => apfst (cons e) | Locale.Expr i => apsnd (cons i)) raw_elems ([], []); val supclasses = map (prep_class thy) raw_supclasses; - val supsort = - supclasses - |> Sign.certify_sort thy - |> (fn [] => Sign.defaultS thy | S => S); (*FIXME Why syntax defaultS?*) - val suplocales = map (Locale.Locale o #locale o the_class_data thy) supclasses; + val sups = filter (is_some o lookup_class_data thy) supclasses; + val supsort = Sign.certify_sort thy supclasses; + val suplocales = map (Locale.Locale o #locale o the_class_data thy) sups; val supexpr = Locale.Merge (suplocales @ includes); val supparams = (map fst o Locale.parameters_of_expr thy) (Locale.Merge suplocales); - val supconsts = AList.make - (the o AList.lookup (op =) (param_map thy supclasses)) (map fst supparams); + val supconsts = AList.make (the o AList.lookup (op =) (param_map thy sups)) + (map fst supparams); (*val elems_constrains = map (Element.Constrains o apsnd (Term.map_type_tfree subst_classtyvar)) supparams;*) + fun mk_tyvar (_, sort) = TFree (AxClass.param_tyvarname, + if Sign.subsort thy (supsort, sort) then sort else error + ("Sort " ^ Sign.string_of_sort thy sort + ^ " is less general than permitted least general sort " + ^ Sign.string_of_sort thy supsort)); fun extract_params thy name_locale = - let + let val params = Locale.parameters_of thy name_locale; in (map (fst o fst) params, params - |> (map o apfst o apsnd o Term.map_type_tfree) - (K (TFree (AxClass.param_tyvarname, Sign.defaultS thy))) + |> (map o apfst o apsnd o Term.map_type_tfree) mk_tyvar |> (map o apsnd) (fork_mixfix true NONE #> fst) |> chop (length supconsts) |> snd) @@ -493,7 +490,7 @@ #-> (fn (name_axclass, ((_, (ax_terms, ax_axioms)), consts)) => `(fn thy => extract_axiom_names thy name_locale) #-> (fn axiom_names => - add_class_data ((name_axclass, supclasses), + add_class_data ((name_axclass, sups), (name_locale, map (fst o fst) params ~~ map fst consts, map2 make_witness ax_terms ax_axioms, axiom_names)) #> prove_interpretation ((ALLGOALS o ProofContext.fact_tac) ax_axioms) @@ -505,8 +502,8 @@ in -val class_cmd = gen_class Locale.add_locale read_class AxClass.read_param; -val class = gen_class Locale.add_locale_i certify_class (K I); +val class_cmd = gen_class Locale.add_locale Sign.intern_class AxClass.read_param; +val class = gen_class Locale.add_locale_i Sign.certify_class (K I); end; (*local*)