src/HOLCF/Tools/Domain/domain.ML
author huffman
Wed, 20 Oct 2010 13:02:13 -0700
changeset 40042 87c72a02eaf2
parent 40040 3adb92ee2f22
child 40043 3007608368e2
permissions -rw-r--r--
simplify check_and_sort_domain; more meaningful variable names
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
40040
3adb92ee2f22 rename domain_theorems.ML to domain_induction.ML; rename domain_extender.ML to domain.ML
huffman
parents: 40026
diff changeset
     1
(*  Title:      HOLCF/Tools/Domain/domain.ML
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     2
    Author:     David von Oheimb
35794
8cd7134275cc use headers consistently
huffman
parents: 35776
diff changeset
     3
    Author:     Brian Huffman
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     4
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     5
Theory extender for domain command, including theory syntax.
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     6
*)
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     7
40040
3adb92ee2f22 rename domain_theorems.ML to domain_induction.ML; rename domain_extender.ML to domain.ML
huffman
parents: 40026
diff changeset
     8
signature DOMAIN =
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     9
sig
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    10
  val add_domain_cmd:
35774
218e9766a848 replace some string arguments with bindings
huffman
parents: 35659
diff changeset
    11
      binding ->
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    12
      ((string * string option) list * binding * mixfix *
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    13
       (binding * (bool * binding option * string) list * mixfix) list) list
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    14
      -> theory -> theory
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    15
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    16
  val add_domain:
35774
218e9766a848 replace some string arguments with bindings
huffman
parents: 35659
diff changeset
    17
      binding ->
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    18
      ((string * string option) list * binding * mixfix *
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    19
       (binding * (bool * binding option * typ) list * mixfix) list) list
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    20
      -> theory -> theory
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
    21
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
    22
  val add_new_domain_cmd:
35774
218e9766a848 replace some string arguments with bindings
huffman
parents: 35659
diff changeset
    23
      binding ->
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
    24
      ((string * string option) list * binding * mixfix *
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
    25
       (binding * (bool * binding option * string) list * mixfix) list) list
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
    26
      -> theory -> theory
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
    27
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
    28
  val add_new_domain:
35774
218e9766a848 replace some string arguments with bindings
huffman
parents: 35659
diff changeset
    29
      binding ->
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
    30
      ((string * string option) list * binding * mixfix *
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
    31
       (binding * (bool * binding option * typ) list * mixfix) list) list
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
    32
      -> theory -> theory
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    33
end;
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    34
40040
3adb92ee2f22 rename domain_theorems.ML to domain_induction.ML; rename domain_extender.ML to domain.ML
huffman
parents: 40026
diff changeset
    35
structure Domain :> DOMAIN =
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    36
struct
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    37
40026
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
    38
open HOLCF_Library;
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
    39
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
    40
fun first  (x,_,_) = x;
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
    41
fun second (_,x,_) = x;
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
    42
fun third  (_,_,x) = x;
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
    43
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
    44
fun upd_first  f (x,y,z) = (f x,   y,   z);
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
    45
fun upd_second f (x,y,z) = (  x, f y,   z);
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
    46
fun upd_third  f (x,y,z) = (  x,   y, f z);
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    47
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    48
(* ----- general testing and preprocessing of constructor list -------------- *)
30919
dcf8a7a66bd1 make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents: 30916
diff changeset
    49
fun check_and_sort_domain
39965
da88519e6a0b new_domain emits proper error message when a constructor argument type does not have sort 'rep'
huffman
parents: 39557
diff changeset
    50
    (arg_sort : bool -> sort)
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    51
    (dtnvs : (string * typ list) list)
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    52
    (cons'' : (binding * (bool * binding option * typ) list * mixfix) list list)
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
    53
    (thy : theory)
40042
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
    54
    : (binding * (bool * binding option * typ) list * mixfix) list list =
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    55
  let
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
    56
    val defaultS = Sign.defaultS thy;
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    57
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    58
    val all_cons = map (Binding.name_of o first) (flat cons'');
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    59
    val test_dupl_cons =
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    60
      case duplicates (op =) all_cons of 
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    61
        [] => false | dups => error ("Duplicate constructors: " 
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    62
                                      ^ commas_quote dups);
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    63
    val all_sels =
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    64
      (map Binding.name_of o map_filter second o maps second) (flat cons'');
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    65
    val test_dupl_sels =
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    66
      case duplicates (op =) all_sels of
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    67
        [] => false | dups => error("Duplicate selectors: "^commas_quote dups);
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    68
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    69
    fun test_dupl_tvars s =
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    70
      case duplicates (op =) (map(fst o dest_TFree)s) of
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    71
        [] => false | dups => error("Duplicate type arguments: " 
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    72
                                    ^commas_quote dups);
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    73
    val test_dupl_tvars' = exists test_dupl_tvars (map snd dtnvs);
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    74
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    75
    (* test for free type variables, illegal sort constraints on rhs,
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    76
       non-pcpo-types and invalid use of recursive type;
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    77
       replace sorts in type variables on rhs *)
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    78
    fun analyse_equation ((dname,typevars),cons') = 
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    79
      let
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    80
        val tvars = map dest_TFree typevars;
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    81
        fun rm_sorts (TFree(s,_)) = TFree(s,[])
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    82
          | rm_sorts (Type(s,ts)) = Type(s,remove_sorts ts)
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    83
          | rm_sorts (TVar(s,_))  = TVar(s,[])
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    84
        and remove_sorts l = map rm_sorts l;
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    85
        fun analyse indirect (TFree(v,s))  =
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    86
            (case AList.lookup (op =) tvars v of 
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    87
               NONE => error ("Free type variable " ^ quote v ^ " on rhs.")
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    88
             | SOME sort => if eq_set (op =) (s, defaultS) orelse
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    89
                               eq_set (op =) (s, sort)
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    90
                            then TFree(v,sort)
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    91
                            else error ("Inconsistent sort constraint" ^
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    92
                                        " for type variable " ^ quote v))
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    93
          | analyse indirect (t as Type(s,typl)) =
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    94
            (case AList.lookup (op =) dtnvs s of
36119
ff605b8fdfdb remove dead code
huffman
parents: 36118
diff changeset
    95
               NONE => Type (s, map (analyse false) typl)
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    96
             | SOME typevars =>
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    97
                 if indirect 
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
    98
                 then error ("Indirect recursion of type " ^ 
40026
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
    99
                             quote (Syntax.string_of_typ_global thy t))
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   100
                 else if dname <> s orelse
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   101
                         (** BUG OR FEATURE?:
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   102
                             mutual recursion may use different arguments **)
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   103
                         remove_sorts typevars = remove_sorts typl 
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   104
                 then Type(s,map (analyse true) typl)
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   105
                 else error ("Direct recursion of type " ^ 
40026
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
   106
                             quote (Syntax.string_of_typ_global thy t) ^ 
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   107
                             " with different arguments"))
40026
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
   108
          | analyse indirect (TVar _) = error "extender:analyse";
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   109
        fun check_pcpo lazy T =
39965
da88519e6a0b new_domain emits proper error message when a constructor argument type does not have sort 'rep'
huffman
parents: 39557
diff changeset
   110
            let val sort = arg_sort lazy in
da88519e6a0b new_domain emits proper error message when a constructor argument type does not have sort 'rep'
huffman
parents: 39557
diff changeset
   111
              if Sign.of_sort thy (T, sort) then T
da88519e6a0b new_domain emits proper error message when a constructor argument type does not have sort 'rep'
huffman
parents: 39557
diff changeset
   112
              else error ("Constructor argument type is not of sort " ^
da88519e6a0b new_domain emits proper error message when a constructor argument type does not have sort 'rep'
huffman
parents: 39557
diff changeset
   113
                          Syntax.string_of_sort_global thy sort ^ ": " ^
40026
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
   114
                          Syntax.string_of_typ_global thy T)
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   115
            end;
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   116
        fun analyse_arg (lazy, sel, T) =
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   117
            (lazy, sel, check_pcpo lazy (analyse false T));
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   118
        fun analyse_con (b, args, mx) = (b, map analyse_arg args, mx);
40042
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   119
      in map analyse_con cons' end; 
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   120
  in ListPair.map analyse_equation (dtnvs,cons'')
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   121
  end; (* let *)
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   122
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   123
(* ----- calls for building new thy and thms -------------------------------- *)
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   124
36118
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   125
type info =
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   126
     Domain_Take_Proofs.iso_info list * Domain_Take_Proofs.take_induct_info;
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   127
30919
dcf8a7a66bd1 make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents: 30916
diff changeset
   128
fun gen_add_domain
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   129
    (prep_typ : theory -> 'a -> typ)
36118
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   130
    (add_isos : (binding * mixfix * (typ * typ)) list -> theory -> info * theory)
39965
da88519e6a0b new_domain emits proper error message when a constructor argument type does not have sort 'rep'
huffman
parents: 39557
diff changeset
   131
    (arg_sort : bool -> sort)
35774
218e9766a848 replace some string arguments with bindings
huffman
parents: 35659
diff changeset
   132
    (comp_dbind : binding)
40042
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   133
    (raw_specs : ((string * string option) list * binding * mixfix *
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   134
               (binding * (bool * binding option * 'a) list * mixfix) list) list)
35516
59550ec4921d get rid of primes on thy variables
huffman
parents: 35498
diff changeset
   135
    (thy : theory) =
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   136
  let
35520
f433f18d4c41 cleaned up, added type annotations
huffman
parents: 35519
diff changeset
   137
    val dtnvs : (binding * typ list * mixfix) list =
f433f18d4c41 cleaned up, added type annotations
huffman
parents: 35519
diff changeset
   138
      let
f433f18d4c41 cleaned up, added type annotations
huffman
parents: 35519
diff changeset
   139
        fun readS (SOME s) = Syntax.read_sort_global thy s
f433f18d4c41 cleaned up, added type annotations
huffman
parents: 35519
diff changeset
   140
          | readS NONE = Sign.defaultS thy;
f433f18d4c41 cleaned up, added type annotations
huffman
parents: 35519
diff changeset
   141
        fun readTFree (a, s) = TFree (a, readS s);
f433f18d4c41 cleaned up, added type annotations
huffman
parents: 35519
diff changeset
   142
      in
f433f18d4c41 cleaned up, added type annotations
huffman
parents: 35519
diff changeset
   143
        map (fn (vs,dname:binding,mx,_) =>
40042
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   144
                (dname, map readTFree vs, mx)) raw_specs
35520
f433f18d4c41 cleaned up, added type annotations
huffman
parents: 35519
diff changeset
   145
      end;
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   146
40042
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   147
    fun thy_type (dbind, tvars, mx) = (dbind, length tvars, mx);
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   148
    fun thy_arity (dbind, tvars, mx) =
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   149
      (Sign.full_name thy dbind, map (snd o dest_TFree) tvars, arg_sort false);
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   150
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   151
    (* this theory is used just for parsing and error checking *)
35516
59550ec4921d get rid of primes on thy variables
huffman
parents: 35498
diff changeset
   152
    val tmp_thy = thy
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   153
      |> Theory.copy
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   154
      |> Sign.add_types (map thy_type dtnvs)
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   155
      |> fold (AxClass.axiomatize_arity o thy_arity) dtnvs;
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   156
35776
b0bc15d8ad3b pass domain binding as argument to Domain_Theorems.theorems; proper qualified bindings for theorem names
huffman
parents: 35775
diff changeset
   157
    val dbinds : binding list =
40042
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   158
        map (fn (_,dbind,_,_) => dbind) raw_specs;
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   159
    val raw_conss :
35520
f433f18d4c41 cleaned up, added type annotations
huffman
parents: 35519
diff changeset
   160
        (binding * (bool * binding option * 'a) list * mixfix) list list =
40042
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   161
        map (fn (_,_,_,cons) => cons) raw_specs;
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   162
    val conss :
35520
f433f18d4c41 cleaned up, added type annotations
huffman
parents: 35519
diff changeset
   163
        (binding * (bool * binding option * typ) list * mixfix) list list =
40042
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   164
        map (map (upd_second (map (upd_third (prep_typ tmp_thy))))) raw_conss;
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   165
    val dtnvs' : (string * typ list) list =
40042
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   166
        map (fn (dbind, vs, mx) => (Sign.full_name thy dbind, vs)) dtnvs;
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   167
    val conss :
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   168
        (binding * (bool * binding option * typ) list * mixfix) list list =
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   169
        check_and_sort_domain arg_sort dtnvs' conss tmp_thy;
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   170
40026
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
   171
    fun mk_arg_typ (lazy, dest_opt, T) = if lazy then mk_upT T else T;
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   172
    fun mk_con_typ (bind, args, mx) =
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   173
        if null args then oneT else foldr1 mk_sprodT (map mk_arg_typ args);
40042
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   174
    fun mk_eq_typ cons = foldr1 mk_ssumT (map mk_con_typ cons);
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   175
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   176
    val absTs : typ list = map Type dtnvs';
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   177
    val repTs : typ list = map mk_eq_typ conss;
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   178
36118
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   179
    val iso_spec : (binding * mixfix * (typ * typ)) list =
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   180
        map (fn ((dbind, _, mx), eq) => (dbind, mx, eq))
40042
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   181
          (dtnvs ~~ (absTs ~~ repTs));
36118
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   182
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   183
    val ((iso_infos, take_info), thy) = add_isos iso_spec thy;
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   184
40016
2eff1cbc1ccb remove function Domain_Theorems.theorems; bind theorem names directly from Domain_Constructors.add_domain_constructors
huffman
parents: 39986
diff changeset
   185
    val (constr_infos, thy) =
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   186
        thy
40042
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   187
          |> fold_map (fn ((dbind, cons), info) =>
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   188
                Domain_Constructors.add_domain_constructors dbind cons info)
87c72a02eaf2 simplify check_and_sort_domain; more meaningful variable names
huffman
parents: 40040
diff changeset
   189
             (dbinds ~~ conss ~~ iso_infos);
40016
2eff1cbc1ccb remove function Domain_Theorems.theorems; bind theorem names directly from Domain_Constructors.add_domain_constructors
huffman
parents: 39986
diff changeset
   190
40026
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
   191
    val (take_rews, thy) =
40040
3adb92ee2f22 rename domain_theorems.ML to domain_induction.ML; rename domain_extender.ML to domain.ML
huffman
parents: 40026
diff changeset
   192
        Domain_Induction.comp_theorems comp_dbind
40026
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
   193
          dbinds take_info constr_infos thy;
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   194
  in
40026
8f8f18a88685 remove last few dependencies on domain_library.ML and delete it; temporarily disable emptiness check
huffman
parents: 40019
diff changeset
   195
    thy
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   196
  end;
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   197
36118
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   198
fun define_isos (spec : (binding * mixfix * (typ * typ)) list) =
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   199
  let
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   200
    fun prep (dbind, mx, (lhsT, rhsT)) =
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   201
      let val (dname, vs) = dest_Type lhsT;
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   202
      in (map (fst o dest_TFree) vs, dbind, mx, rhsT, NONE) end;
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   203
  in
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   204
    Domain_Isomorphism.domain_isomorphism (map prep spec)
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   205
  end;
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   206
39965
da88519e6a0b new_domain emits proper error message when a constructor argument type does not have sort 'rep'
huffman
parents: 39557
diff changeset
   207
fun pcpo_arg lazy = if lazy then @{sort cpo} else @{sort pcpo};
39986
38677db30cad rename class 'sfp' to 'bifinite'
huffman
parents: 39974
diff changeset
   208
fun rep_arg lazy = @{sort bifinite};
39965
da88519e6a0b new_domain emits proper error message when a constructor argument type does not have sort 'rep'
huffman
parents: 39557
diff changeset
   209
36118
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   210
val add_domain =
39965
da88519e6a0b new_domain emits proper error message when a constructor argument type does not have sort 'rep'
huffman
parents: 39557
diff changeset
   211
    gen_add_domain Sign.certify_typ Domain_Axioms.add_axioms pcpo_arg;
36118
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   212
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   213
val add_new_domain =
39965
da88519e6a0b new_domain emits proper error message when a constructor argument type does not have sort 'rep'
huffman
parents: 39557
diff changeset
   214
    gen_add_domain Sign.certify_typ define_isos rep_arg;
36118
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   215
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   216
val add_domain_cmd =
39965
da88519e6a0b new_domain emits proper error message when a constructor argument type does not have sort 'rep'
huffman
parents: 39557
diff changeset
   217
    gen_add_domain Syntax.read_typ_global Domain_Axioms.add_axioms pcpo_arg;
36118
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   218
413d6d1f0f6e share more code between definitional and axiomatic domain packages
huffman
parents: 36117
diff changeset
   219
val add_new_domain_cmd =
39965
da88519e6a0b new_domain emits proper error message when a constructor argument type does not have sort 'rep'
huffman
parents: 39557
diff changeset
   220
    gen_add_domain Syntax.read_typ_global define_isos rep_arg;
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   221
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   222
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   223
(** outer syntax **)
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   224
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   225
val _ = Keyword.keyword "lazy";
24867
e5b55d7be9bb simplified interfaces for outer syntax;
wenzelm
parents: 24712
diff changeset
   226
30919
dcf8a7a66bd1 make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents: 30916
diff changeset
   227
val dest_decl : (bool * binding option * string) parser =
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   228
  Parse.$$$ "(" |-- Scan.optional (Parse.$$$ "lazy" >> K true) false --
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   229
    (Parse.binding >> SOME) -- (Parse.$$$ "::" |-- Parse.typ)  --| Parse.$$$ ")" >> Parse.triple1
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   230
    || Parse.$$$ "(" |-- Parse.$$$ "lazy" |-- Parse.typ --| Parse.$$$ ")"
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   231
    >> (fn t => (true,NONE,t))
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   232
    || Parse.typ >> (fn t => (false,NONE,t));
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   233
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   234
val cons_decl =
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   235
  Parse.binding -- Scan.repeat dest_decl -- Parse.opt_mixfix;
30916
a3d2128cac92 allow infix declarations for type constructors defined with domain package
huffman
parents: 30915
diff changeset
   236
a3d2128cac92 allow infix declarations for type constructors defined with domain package
huffman
parents: 30915
diff changeset
   237
val domain_decl =
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   238
  (Parse.type_args_constrained -- Parse.binding -- Parse.opt_mixfix) --
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   239
    (Parse.$$$ "=" |-- Parse.enum1 "|" cons_decl);
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   240
30916
a3d2128cac92 allow infix declarations for type constructors defined with domain package
huffman
parents: 30915
diff changeset
   241
val domains_decl =
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   242
  Scan.option (Parse.$$$ "(" |-- Parse.binding --| Parse.$$$ ")") --
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   243
    Parse.and_list1 domain_decl;
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   244
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   245
fun mk_domain
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   246
    (definitional : bool)
35774
218e9766a848 replace some string arguments with bindings
huffman
parents: 35659
diff changeset
   247
    (opt_name : binding option,
33796
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   248
     doms : ((((string * string option) list * binding) * mixfix) *
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   249
             ((binding * (bool * binding option * string) list) * mixfix) list) list ) =
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   250
  let
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   251
    val names = map (fn (((_, t), _), _) => Binding.name_of t) doms;
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   252
    val specs : ((string * string option) list * binding * mixfix *
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   253
                 (binding * (bool * binding option * string) list * mixfix) list) list =
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   254
        map (fn (((vs, t), mx), cons) =>
6442aa3773a2 clean up indentation
huffman
parents: 33038
diff changeset
   255
                (vs, t, mx, map (fn ((c, ds), mx) => (c, ds, mx)) cons)) doms;
35774
218e9766a848 replace some string arguments with bindings
huffman
parents: 35659
diff changeset
   256
    val comp_dbind =
218e9766a848 replace some string arguments with bindings
huffman
parents: 35659
diff changeset
   257
        case opt_name of NONE => Binding.name (space_implode "_" names)
218e9766a848 replace some string arguments with bindings
huffman
parents: 35659
diff changeset
   258
                       | SOME s => s;
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   259
  in
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   260
    if definitional 
35774
218e9766a848 replace some string arguments with bindings
huffman
parents: 35659
diff changeset
   261
    then add_new_domain_cmd comp_dbind specs
218e9766a848 replace some string arguments with bindings
huffman
parents: 35659
diff changeset
   262
    else add_domain_cmd comp_dbind specs
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   263
  end;
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   264
24867
e5b55d7be9bb simplified interfaces for outer syntax;
wenzelm
parents: 24712
diff changeset
   265
val _ =
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   266
  Outer_Syntax.command "domain" "define recursive domains (HOLCF)"
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   267
    Keyword.thy_decl (domains_decl >> (Toplevel.theory o mk_domain false));
33798
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   268
46cbbcbd4e68 clean up indentation; add 'definitional' option flag
huffman
parents: 33796
diff changeset
   269
val _ =
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   270
  Outer_Syntax.command "new_domain" "define recursive domains (HOLCF)"
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36119
diff changeset
   271
    Keyword.thy_decl (domains_decl >> (Toplevel.theory o mk_domain true));
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   272
24867
e5b55d7be9bb simplified interfaces for outer syntax;
wenzelm
parents: 24712
diff changeset
   273
end;