src/Pure/Syntax/type_ext.ML
author clasohm
Thu, 16 Sep 1993 12:20:38 +0200
changeset 0 a5a9c433f639
child 18 c9ec452ff08f
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title:      Pure/Syntax/type_ext
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Author:     Tobias Nipkow and Markus Wenzel, TU Muenchen
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
The concrete syntax of types (used to bootstrap Pure)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
signature TYPE_EXT0 =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
sig
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
  val typ_of_term: (indexname -> sort) -> term -> typ
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
signature TYPE_EXT =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
sig
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
  include TYPE_EXT0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
  structure Extension: EXTENSION
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
  local open Extension Extension.XGram.Ast in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
    val term_of_typ: bool -> typ -> term
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
    val tappl_ast_tr': ast * ast list -> ast
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
    val type_ext: ext
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
  end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
functor TypeExtFun(structure Extension: EXTENSION and Lexicon: LEXICON): TYPE_EXT =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
struct
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
structure Extension = Extension;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
open Extension Extension.XGram.Ast;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
(** typ_of_term **)   (* FIXME check *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
fun typ_of_term def_sort t =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
    fun sort_err (xi as (x, i)) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
      error ("typ_of_term: inconsistent sort constraints for type variable " ^
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
        (if i < 0 then x else Lexicon.string_of_vname xi));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
    fun is_tfree name =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
      (case explode name of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
        "'" :: _ :: _ => true
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
      | _ :: _ => false
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
      | _ => error ("typ_of_term: bad var name " ^ quote name));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
    fun put_sort scs xi s =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
      (case assoc (scs, xi) of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
        None => (xi, s) :: scs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
      | Some s' =>  if s = s' then scs else sort_err xi);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
    fun classes (Const (s, _)) = [s]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
      | classes (Free (s, _)) = [s]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
      | classes (Const ("_sortcons", _) $ Const (s, _) $ cls) = s :: classes cls
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
      | classes (Const ("_sortcons", _) $ Free (s, _) $ cls) = s :: classes cls
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
      | classes tm = raise (TERM ("typ_of_term: bad encoding of classes", [tm]));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
    fun sort (Const ("_emptysort", _)) = []
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
      | sort (Const (s, _)) = [s]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
      | sort (Free (s, _)) = [s]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
      | sort (Const ("_classes", _) $ cls) = classes cls
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
      | sort tm = raise (TERM ("typ_of_term: bad encoding of sort", [tm]));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
    fun typ (Free (x, _), scs) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
          (if is_tfree x then TFree (x, []) else Type (x, []), scs)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
      | typ (Var (xi, _), scs) = (TVar (xi, []), scs)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
      | typ (Const ("_ofsort", _) $ Free (x, _) $ st, scs) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
          (TFree (x, []), put_sort scs (x, ~1) (sort st))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
      | typ (Const ("_ofsort", _) $ Var (xi, _) $ st, scs) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
          (TVar (xi, []), put_sort scs xi (sort st))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
      | typ (Const (a, _), scs) = (Type (a, []), scs)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
      | typ (tm as (_ $ _), scs) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
          let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
            val (t, ts) = strip_comb tm;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
            val a =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
              case t of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
                Const (x, _) => x
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
              | Free (x, _) => x
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
              | _ => raise (TERM ("typ_of_term: bad type application", [tm]));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
            val (tys, scs') = typs (ts, scs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
          in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
            (Type (a, tys), scs')
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
          end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
      | typ (tm, _) = raise (TERM ("typ_of_term: bad encoding of typ", [tm]))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
    and typs (t :: ts, scs) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
          let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
            val (ty, scs') = typ (t, scs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
            val (tys, scs'') = typs (ts, scs');
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
          in (ty :: tys, scs'') end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
      | typs ([], scs) = ([], scs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
    val (ty, scs) = typ (t, []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
    fun get_sort xi =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
      (case assoc (scs, xi) of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
        None => def_sort xi
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
      | Some s => s);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
    fun add_sorts (Type (a, tys)) = Type (a, map add_sorts tys)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
      | add_sorts (TVar (xi, _)) = TVar (xi, get_sort xi)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
      | add_sorts (TFree (x, _)) = TFree (x, get_sort (x, ~1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
    add_sorts ty
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
(** term_of_typ **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
fun term_of_typ show_sorts ty =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
    fun const x = Const (x, dummyT);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
    fun classes [] = raise Match
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
      | classes [s] = const s
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
      | classes (s :: ss) = const "_sortcons" $ const s $ classes ss;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
    fun sort [] = const "_emptysort"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
      | sort [s] = const s
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
      | sort ss = const "_classes" $ classes ss;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   121
    fun of_sort t ss =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   122
      if show_sorts then const "_ofsort" $ t $ sort ss else t;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   123
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   124
    fun typ (Type (a, tys)) = list_comb (const a, map typ tys)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
      | typ (TFree (x, ss)) = of_sort (Free (x, dummyT)) ss
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   126
      | typ (TVar (xi, ss)) = of_sort (Var (xi, dummyT)) ss;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
    typ ty
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
(** the type syntax **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
(* parse translations *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   137
fun tappl_ast_tr (*"_tappl"*) [types, f] = Appl (f :: unfold_ast "_types" types)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
  | tappl_ast_tr (*"_tappl"*) asts = raise_ast "tappl_ast_tr" asts;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   139
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   140
fun bracket_ast_tr (*"_bracket"*) [dom, cod] =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   141
      fold_ast_p "fun" (unfold_ast "_types" dom, cod)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   142
  | bracket_ast_tr (*"_bracket"*) asts = raise_ast "bracket_ast_tr" asts;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   143
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   144
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
(* print translations *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   146
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   147
fun tappl_ast_tr' (f, []) = raise_ast "tappl_ast_tr'" [f]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   148
  | tappl_ast_tr' (f, [ty]) = Appl [Constant "_tapp", ty, f]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   149
  | tappl_ast_tr' (f, tys) = Appl [Constant "_tappl", fold_ast "_types" tys, f];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   150
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
fun fun_ast_tr' (*"fun"*) asts =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   152
  (case unfold_ast_p "fun" (Appl (Constant "fun" :: asts)) of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   153
    (dom as (_ :: _ :: _), cod)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
      => Appl [Constant "_bracket", fold_ast "_types" dom, cod]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   155
  | _ => raise Match);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   156
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   157
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   158
(* type_ext *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   159
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   160
val sortT = Type ("sort", []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
val classesT = Type ("classes", []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   162
val typesT = Type ("types", []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   163
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   164
val type_ext =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   165
  Ext {
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   166
    roots = [logic, "type"],
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   167
    mfix = [
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   168
      Mfix ("_",           idT --> sortT,                 "", [], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   169
      Mfix ("{}",          sortT,                         "_emptysort", [], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   170
      Mfix ("{_}",         classesT --> sortT,            "_classes", [], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   171
      Mfix ("_",           idT --> classesT,              "", [], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   172
      Mfix ("_,_",         [idT, classesT] ---> classesT, "_sortcons", [], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   173
      Mfix ("_",           tfreeT --> typeT,              "", [], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   174
      Mfix ("_",           tvarT --> typeT,               "", [], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   175
      Mfix ("_",           idT --> typeT,                 "", [], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   176
      Mfix ("_::_",        [tfreeT, sortT] ---> typeT,    "_ofsort", [max_pri, 0], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   177
      Mfix ("_::_",        [tvarT, sortT] ---> typeT,     "_ofsort", [max_pri, 0], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   178
      Mfix ("_ _",         [typeT, idT] ---> typeT,       "_tapp", [max_pri, 0], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   179
      Mfix ("((1'(_'))_)", [typesT, idT] ---> typeT,      "_tappl", [], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   180
      Mfix ("_",           typeT --> typesT,              "", [], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   181
      Mfix ("_,/ _",       [typeT, typesT] ---> typesT,   "_types", [], max_pri),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   182
      Mfix ("(_/ => _)",   [typeT, typeT] ---> typeT,     "fun", [1, 0], 0),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   183
      Mfix ("([_]/ => _)", [typesT, typeT] ---> typeT,    "_bracket", [0, 0], 0)],
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   184
    extra_consts = ["fun"],
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
    parse_ast_translation = [("_tapp", tappl_ast_tr), ("_tappl", tappl_ast_tr),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   186
      ("_bracket", bracket_ast_tr)],
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   187
    parse_preproc = None,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   188
    parse_postproc = None,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   189
    parse_translation = [],
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   190
    print_translation = [],
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   191
    print_preproc = None,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   192
    print_postproc = None,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   193
    print_ast_translation = [("fun", fun_ast_tr')]};
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   194
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   195
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   196
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   197