src/Pure/defs.ML
author haftmann
Wed, 21 Sep 2005 10:32:24 +0200
changeset 17540 f662416aa5f2
parent 17412 e26cb20ef0cc
child 17669 94dbbffbf94b
permissions -rw-r--r--
removed assoc, overwrite
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
     1
(*  Title:      Pure/General/defs.ML
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
     2
    ID:         $Id$
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
     3
    Author:     Steven Obua, TU Muenchen
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
     4
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
     5
Checks if definitions preserve consistency of logic by enforcing that
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
     6
there are no cyclic definitions. The algorithm is described in "An
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
     7
Algorithm for Determining Definitional Cycles in Higher-Order Logic
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
     8
with Overloading", Steven Obua, technical report, to be written :-)
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
     9
*)
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    10
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    11
signature DEFS =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    12
sig
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    13
  (*true: record the full chain of definitions that lead to a circularity*)
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    14
  val chain_history: bool ref
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
    15
  type graph
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    16
  val empty: graph
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    17
  val declare: theory -> string * typ -> graph -> graph
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    18
  val define: theory -> string * typ -> string -> (string * typ) list -> graph -> graph
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    19
  val finalize: theory -> string * typ -> graph -> graph
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    20
  val merge: Pretty.pp -> graph -> graph -> graph
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    21
  val finals: graph -> typ list Symtab.table
16743
21dbff595bf6 1) all theorems in Orderings can now be given as a parameter
obua
parents: 16384
diff changeset
    22
  datatype overloadingstate = Open | Closed | Final
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    23
  val overloading_info: graph -> string -> (typ * (string*typ) list * overloadingstate) option
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    24
  val monomorphic: graph -> string -> bool
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    25
end
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    26
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    27
structure Defs :> DEFS = struct
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    28
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    29
type tyenv = Type.tyenv
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    30
type edgelabel = (int * typ * typ * (typ * string * string) list)
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    31
16743
21dbff595bf6 1) all theorems in Orderings can now be given as a parameter
obua
parents: 16384
diff changeset
    32
datatype overloadingstate = Open | Closed | Final
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
    33
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    34
datatype node = Node of
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
    35
         typ  (* most general type of constant *)
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
    36
         * defnode Symtab.table
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    37
             (* a table of defnodes, each corresponding to 1 definition of the
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
    38
                constant for a particular type, indexed by axiom name *)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    39
         * (unit Symtab.table) Symtab.table
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    40
             (* a table of all back referencing defnodes to this node,
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
    41
                indexed by node name of the defnodes *)
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
    42
         * typ list (* a list of all finalized types *)
16743
21dbff595bf6 1) all theorems in Orderings can now be given as a parameter
obua
parents: 16384
diff changeset
    43
         * overloadingstate
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    44
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
    45
     and defnode = Defnode of
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
    46
         typ  (* type of the constant in this particular definition *)
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
    47
         * (edgelabel list) Symtab.table (* The edges, grouped by nodes. *)
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    48
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
    49
fun getnode graph = the o Symtab.lookup graph
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
    50
fun get_nodedefs (Node (_, defs, _, _, _)) = defs
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
    51
fun get_defnode (Node (_, defs, _, _, _)) defname = Symtab.lookup defs defname
17223
430edc6b7826 curried_lookup/update;
wenzelm
parents: 16982
diff changeset
    52
fun get_defnode' graph noderef =
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
    53
  Symtab.lookup (get_nodedefs (the (Symtab.lookup graph noderef)))
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    54
17223
430edc6b7826 curried_lookup/update;
wenzelm
parents: 16982
diff changeset
    55
fun table_size table = Symtab.fold (K (fn x => x + 1)) table 0;
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    56
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    57
datatype graphaction =
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    58
    Declare of string * typ
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    59
  | Define of string * typ * string * string * (string * typ) list
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    60
  | Finalize of string * typ
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    61
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    62
type graph = int * string Symtab.table * graphaction list * node Symtab.table
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
    63
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    64
val chain_history = ref true
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
    65
16384
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
    66
val empty = (0, Symtab.empty, [], Symtab.empty)
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    67
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    68
exception DEFS of string;
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    69
exception CIRCULAR of (typ * string * string) list;
16113
692fe6595755 Infinite chains in definitions are now detected, too.
obua
parents: 16108
diff changeset
    70
exception INFINITE_CHAIN of (typ * string * string) list;
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    71
exception CLASH of string * string * string;
16158
2c3565b74b7a Removed final_consts from theory data. Now const_deps deals with final
obua
parents: 16113
diff changeset
    72
exception FINAL of string * typ;
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    73
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    74
fun def_err s = raise (DEFS s)
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    75
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    76
fun no_forwards defs =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    77
    Symtab.foldl
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    78
    (fn (closed, (_, Defnode (_, edges))) =>
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
    79
        if not closed then false else Symtab.is_empty edges)
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
    80
    (true, defs)
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
    81
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    82
fun checkT' (Type (a, Ts)) = Type (a, map checkT' Ts)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    83
  | checkT' (TFree (a, _)) = TVar ((a, 0), [])        (* FIXME !? *)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    84
  | checkT' (TVar ((a, 0), _)) = TVar ((a, 0), [])
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    85
  | checkT' (T as TVar _) = raise TYPE ("Illegal schematic type variable encountered", [T], []);
16384
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
    86
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
    87
fun checkT thy = Compress.typ thy o checkT';
16384
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
    88
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    89
fun rename ty1 ty2 = Logic.incr_tvar ((maxidx_of_typ ty1)+1) ty2;
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    90
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
    91
fun subst_incr_tvar inc t =
17223
430edc6b7826 curried_lookup/update;
wenzelm
parents: 16982
diff changeset
    92
    if inc > 0 then
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
    93
      let
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    94
        val tv = typ_tvars t
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
    95
        val t' = Logic.incr_tvar inc t
17223
430edc6b7826 curried_lookup/update;
wenzelm
parents: 16982
diff changeset
    96
        fun update_subst ((n, i), _) =
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
    97
          Vartab.update ((n, i), ([], TVar ((n, i + inc), [])));
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
    98
      in
17223
430edc6b7826 curried_lookup/update;
wenzelm
parents: 16982
diff changeset
    99
        (t', fold update_subst tv Vartab.empty)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   100
      end
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   101
    else
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   102
      (t, Vartab.empty)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   103
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   104
fun subst s ty = Envir.norm_type s ty
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   105
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   106
fun subst_history s history = map (fn (ty, cn, dn) => (subst s ty, cn, dn)) history
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   107
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   108
fun is_instance instance_ty general_ty =
16936
93772bd33871 Type.raw_instance, Type.raw_unify, Term.zero_var_indexesT;
wenzelm
parents: 16877
diff changeset
   109
    Type.raw_instance (instance_ty, general_ty)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   110
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   111
fun is_instance_r instance_ty general_ty =
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   112
    is_instance instance_ty (rename instance_ty general_ty)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   113
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   114
fun unify ty1 ty2 =
16936
93772bd33871 Type.raw_instance, Type.raw_unify, Term.zero_var_indexesT;
wenzelm
parents: 16877
diff changeset
   115
    SOME (Type.raw_unify (ty1, ty2) Vartab.empty)
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   116
    handle Type.TUNIFY => NONE
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   117
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   118
(*
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   119
   Unifies ty1 and ty2, renaming ty1 and ty2 so that they have greater indices than max and
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   120
   so that they are different. All indices in ty1 and ty2 are supposed to be less than or
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   121
   equal to max.
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   122
   Returns SOME (max', s1, s2), so that s1(ty1) = s2(ty2) and max' is greater or equal than
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   123
   all indices in s1, s2, ty1, ty2.
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   124
*)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   125
fun unify_r max ty1 ty2 =
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   126
    let
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   127
      val max = Int.max(max, 0)
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   128
      val max1 = max (* >= maxidx_of_typ ty1 *)
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   129
      val max2 = max (* >= maxidx_of_typ ty2 *)
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   130
      val max = Int.max(max, Int.max (max1, max2))
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   131
      val (ty1, s1) = subst_incr_tvar (max + 1) ty1
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   132
      val (ty2, s2) = subst_incr_tvar (max + max1 + 2) ty2
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   133
      val max = max + max1 + max2 + 2
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   134
      fun merge a b = Vartab.merge (fn _ => false) (a, b)
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   135
    in
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   136
      case unify ty1 ty2 of
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   137
        NONE => NONE
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   138
      | SOME s => SOME (max, merge s1 s, merge s2 s)
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   139
    end
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   140
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   141
fun can_be_unified_r ty1 ty2 = is_some (unify ty1 (rename ty1 ty2))
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   142
fun can_be_unified ty1 ty2 = is_some (unify ty1 ty2)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   143
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   144
fun normalize_edge_idx (edge as (maxidx, u1, v1, history)) =
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   145
    if maxidx <= 1000000 then edge else
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   146
    let
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   147
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   148
      fun idxlist idx extract_ty inject_ty (tab, max) ts =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   149
          foldr
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   150
            (fn (e, ((tab, max), ts)) =>
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   151
                let
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   152
                  val ((tab, max), ty) = idx (tab, max) (extract_ty e)
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   153
                  val e = inject_ty (ty, e)
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   154
                in
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   155
                  ((tab, max), e::ts)
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   156
                end)
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   157
            ((tab,max), []) ts
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   158
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   159
      fun idx (tab,max) (TVar ((a,i),_)) =
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   160
          (case Inttab.lookup tab i of
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   161
             SOME j => ((tab, max), TVar ((a,j),[]))
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   162
           | NONE => ((Inttab.update (i, max) tab, max + 1), TVar ((a,max),[])))
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   163
        | idx (tab,max) (Type (t, ts)) =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   164
          let
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   165
            val ((tab, max), ts) = idxlist idx I fst (tab, max) ts
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   166
          in
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   167
            ((tab,max), Type (t, ts))
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   168
          end
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   169
        | idx (tab, max) ty = ((tab, max), ty)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   170
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   171
      val ((tab,max), u1) = idx (Inttab.empty, 0) u1
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   172
      val ((tab,max), v1) = idx (tab, max) v1
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   173
      val ((tab,max), history) =
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   174
          idxlist idx
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   175
            (fn (ty,_,_) => ty)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   176
            (fn (ty, (_, s1, s2)) => (ty, s1, s2))
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   177
            (tab, max) history
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   178
    in
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   179
      (max, u1, v1, history)
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   180
    end
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   181
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   182
fun compare_edges (e1 as (maxidx1, u1, v1, history1)) (e2 as (maxidx2, u2, v2, history2)) =
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   183
    let
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   184
      val t1 = u1 --> v1
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   185
      val t2 = Logic.incr_tvar (maxidx1+1) (u2 --> v2)
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   186
    in
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   187
      if (is_instance t1 t2) then
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   188
        (if is_instance t2 t1 then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   189
           SOME (int_ord (length history2, length history1))
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   190
         else
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   191
           SOME LESS)
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   192
      else if (is_instance t2 t1) then
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   193
        SOME GREATER
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   194
      else
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   195
        NONE
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   196
    end
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   197
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   198
fun merge_edges_1 (x, []) = [x]
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   199
  | merge_edges_1 (x, (y::ys)) =
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   200
    (case compare_edges x y of
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   201
       SOME LESS => (y::ys)
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   202
     | SOME EQUAL => (y::ys)
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   203
     | SOME GREATER => merge_edges_1 (x, ys)
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   204
     | NONE => y::(merge_edges_1 (x, ys)))
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   205
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   206
fun merge_edges xs ys = foldl merge_edges_1 xs ys
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   207
16384
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   208
fun declare' (g as (cost, axmap, actions, graph)) (cty as (name, ty)) =
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   209
    (cost, axmap, (Declare cty)::actions,
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   210
     Symtab.update_new (name, Node (ty, Symtab.empty, Symtab.empty, [], Open)) graph)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   211
    handle Symtab.DUP _ =>
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   212
           let
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   213
             val (Node (gty, _, _, _, _)) = the (Symtab.lookup graph name)
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   214
           in
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   215
             if is_instance_r ty gty andalso is_instance_r gty ty then
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   216
               g
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   217
             else
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   218
               def_err "constant is already declared with different type"
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   219
           end
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   220
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   221
fun declare'' thy g (name, ty) = declare' g (name, checkT thy ty)
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   222
16384
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   223
val axcounter = ref (IntInf.fromInt 0)
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   224
fun newaxname axmap axname =
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   225
    let
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   226
      val c = !axcounter
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   227
      val _ = axcounter := c+1
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   228
      val axname' = axname^"_"^(IntInf.toString c)
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   229
    in
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   230
      (Symtab.update (axname', axname) axmap, axname')
16384
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   231
    end
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   232
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   233
fun translate_ex axmap x =
16384
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   234
    let
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   235
      fun translate (ty, nodename, axname) =
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   236
          (ty, nodename, the (Symtab.lookup axmap axname))
16384
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   237
    in
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   238
      case x of
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   239
        INFINITE_CHAIN chain => raise (INFINITE_CHAIN (map translate chain))
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   240
      | CIRCULAR cycle => raise (CIRCULAR (map translate cycle))
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   241
      | _ => raise x
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   242
    end
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   243
16826
ed53f24149f6 - fixed bug concerning the renaming of axiom names
obua
parents: 16766
diff changeset
   244
fun define' (cost, axmap, actions, graph) (mainref, ty) axname orig_axname body =
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   245
    let
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   246
      val mainnode  = (case Symtab.lookup graph mainref of
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   247
                         NONE => def_err ("constant "^mainref^" is not declared")
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   248
                       | SOME n => n)
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   249
      val (Node (gty, defs, backs, finals, _)) = mainnode
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   250
      val _ = (if is_instance_r ty gty then ()
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   251
               else def_err "type of constant does not match declared type")
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   252
      fun check_def (s, Defnode (ty', _)) =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   253
          (if can_be_unified_r ty ty' then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   254
             raise (CLASH (mainref, axname, s))
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   255
           else if s = axname then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   256
             def_err "name of axiom is already used for another definition of this constant"
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   257
           else false)
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   258
      val _ = Symtab.exists check_def defs
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   259
      fun check_final finalty =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   260
          (if can_be_unified_r finalty ty then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   261
             raise (FINAL (mainref, finalty))
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   262
           else
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   263
             true)
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   264
      val _ = forall check_final finals
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   265
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   266
      (* now we know that the only thing that can prevent acceptance of the definition
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   267
         is a cyclic dependency *)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   268
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   269
      fun insert_edges edges (nodename, links) =
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   270
          (if links = [] then
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   271
             edges
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   272
           else
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   273
             let
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   274
               val links = map normalize_edge_idx links
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   275
             in
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   276
               Symtab.update (nodename,
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   277
                               case Symtab.lookup edges nodename of
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   278
                                 NONE => links
17223
430edc6b7826 curried_lookup/update;
wenzelm
parents: 16982
diff changeset
   279
                               | SOME links' => merge_edges links' links) edges
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   280
             end)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   281
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   282
      fun make_edges ((bodyn, bodyty), edges) =
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   283
          let
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   284
            val bnode =
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   285
                (case Symtab.lookup graph bodyn of
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   286
                   NONE => def_err "body of constant definition references undeclared constant"
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   287
                 | SOME x => x)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   288
            val (Node (general_btyp, bdefs, bbacks, bfinals, closed)) = bnode
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   289
          in
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   290
            if closed = Final then edges else
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   291
            case unify_r 0 bodyty general_btyp of
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   292
              NONE => edges
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   293
            | SOME (maxidx, sigma1, sigma2) =>
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   294
              if exists (is_instance_r bodyty) bfinals then
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   295
                edges
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   296
              else
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   297
                let
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   298
                  fun insert_trans_edges ((step1, edges), (nodename, links)) =
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   299
                      let
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   300
                        val (maxidx1, alpha1, beta1, defname) = step1
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   301
                        fun connect (maxidx2, alpha2, beta2, history) =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   302
                            case unify_r (Int.max (maxidx1, maxidx2)) beta1 alpha2 of
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   303
                              NONE => NONE
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   304
                            | SOME (max, sleft, sright) =>
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   305
                              SOME (max, subst sleft alpha1, subst sright beta2,
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   306
                                    if !chain_history then
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   307
                                      ((subst sleft beta1, bodyn, defname)::
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   308
                                       (subst_history sright history))
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   309
                                    else [])
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   310
                        val links' = List.mapPartial connect links
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   311
                      in
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   312
                        (step1, insert_edges edges (nodename, links'))
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   313
                      end
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   314
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   315
                  fun make_edges' ((swallowed, edges),
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   316
                                   (def_name, Defnode (def_ty, def_edges))) =
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   317
                      if swallowed then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   318
                        (swallowed, edges)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   319
                      else
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   320
                        (case unify_r 0 bodyty def_ty of
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   321
                           NONE => (swallowed, edges)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   322
                         | SOME (maxidx, sigma1, sigma2) =>
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   323
                           (is_instance_r bodyty def_ty,
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   324
                            snd (Symtab.foldl insert_trans_edges
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   325
                              (((maxidx, subst sigma1 ty, subst sigma2 def_ty, def_name),
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   326
                                edges), def_edges))))
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   327
                  val (swallowed, edges) = Symtab.foldl make_edges' ((false, edges), bdefs)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   328
                in
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   329
                  if swallowed then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   330
                    edges
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   331
                  else
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   332
                    insert_edges edges
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   333
                    (bodyn, [(maxidx, subst sigma1 ty, subst sigma2 general_btyp,[])])
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   334
                end
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   335
          end
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   336
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   337
      val edges = foldl make_edges Symtab.empty body
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   338
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   339
      (* We also have to add the backreferences that this new defnode induces. *)
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   340
      fun install_backrefs (graph, (noderef, links)) =
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   341
          if links <> [] then
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   342
            let
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   343
              val (Node (ty, defs, backs, finals, closed)) = getnode graph noderef
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   344
              val _ = if closed = Final then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   345
                        sys_error ("install_backrefs: closed node cannot be updated")
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   346
                      else ()
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   347
              val defnames =
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   348
                  (case Symtab.lookup backs mainref of
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   349
                     NONE => Symtab.empty
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   350
                   | SOME s => s)
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   351
              val defnames' = Symtab.update_new (axname, ()) defnames
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   352
              val backs' = Symtab.update (mainref, defnames') backs
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   353
            in
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   354
              Symtab.update (noderef, Node (ty, defs, backs', finals, closed)) graph
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   355
            end
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   356
          else
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   357
            graph
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   358
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   359
      val graph = Symtab.foldl install_backrefs (graph, edges)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   360
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   361
      val (Node (_, _, backs, _, closed)) = getnode graph mainref
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   362
      val closed =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   363
          if closed = Final then sys_error "define: closed node"
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   364
          else if closed = Open andalso is_instance_r gty ty then Closed else closed
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   365
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   366
      val thisDefnode = Defnode (ty, edges)
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   367
      val graph = Symtab.update (mainref, Node (gty, Symtab.update_new
17223
430edc6b7826 curried_lookup/update;
wenzelm
parents: 16982
diff changeset
   368
        (axname, thisDefnode) defs, backs, finals, closed)) graph
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   369
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   370
      (* Now we have to check all backreferences to this node and inform them about
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   371
         the new defnode. In this section we also check for circularity. *)
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   372
      fun update_backrefs ((backs, graph), (noderef, defnames)) =
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   373
          let
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   374
            fun update_defs ((defnames, graph),(defname, _)) =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   375
                let
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   376
                  val (Node (nodety, nodedefs, nodebacks, nodefinals, closed)) =
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   377
                      getnode graph noderef
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   378
                  val _ = if closed = Final then sys_error "update_defs: closed node" else ()
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   379
                  val (Defnode (def_ty, defnode_edges)) =
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   380
                      the (Symtab.lookup nodedefs defname)
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   381
                  val edges = the (Symtab.lookup defnode_edges mainref)
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   382
                  val refclosed = ref false
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   383
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   384
                  (* the type of thisDefnode is ty *)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   385
                  fun update (e as (max, alpha, beta, history), (changed, edges)) =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   386
                      case unify_r max beta ty of
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   387
                        NONE => (changed, e::edges)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   388
                      | SOME (max', s_beta, s_ty) =>
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   389
                        let
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   390
                          val alpha' = subst s_beta alpha
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   391
                          val ty' = subst s_ty ty
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   392
                          val _ =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   393
                              if noderef = mainref andalso defname = axname then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   394
                                (case unify alpha' ty' of
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   395
                                   NONE =>
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   396
                                   if (is_instance_r ty' alpha') then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   397
                                     raise (INFINITE_CHAIN (
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   398
                                            (alpha', mainref, axname)::
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   399
                                            (subst_history s_beta history)@
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   400
                                            [(ty', mainref, axname)]))
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   401
                                   else ()
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   402
                                 | SOME s =>
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   403
                                   raise (CIRCULAR (
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   404
                                          (subst s alpha', mainref, axname)::
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   405
                                          (subst_history s (subst_history s_beta history))@
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   406
                                          [(subst s ty', mainref, axname)])))
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   407
                              else ()
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   408
                        in
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   409
                          if is_instance_r beta ty then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   410
                            (true, edges)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   411
                          else
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   412
                            (changed, e::edges)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   413
                        end
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   414
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   415
                  val (changed, edges') = foldl update (false, []) edges
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   416
                  val defnames' = if edges' = [] then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   417
                                    defnames
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   418
                                  else
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   419
                                    Symtab.update (defname, ()) defnames
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   420
                in
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   421
                  if changed then
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   422
                    let
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   423
                      val defnode_edges' =
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   424
                          if edges' = [] then
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   425
                            Symtab.delete mainref defnode_edges
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   426
                          else
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   427
                            Symtab.update (mainref, edges') defnode_edges
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   428
                      val defnode' = Defnode (def_ty, defnode_edges')
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   429
                      val nodedefs' = Symtab.update (defname, defnode') nodedefs
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   430
                      val closed = if closed = Closed andalso Symtab.is_empty defnode_edges'
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   431
                                      andalso no_forwards nodedefs'
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   432
                                   then Final else closed
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   433
                      val graph' =
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   434
                        Symtab.update
17223
430edc6b7826 curried_lookup/update;
wenzelm
parents: 16982
diff changeset
   435
                          (noderef, Node (nodety, nodedefs', nodebacks, nodefinals, closed)) graph
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   436
                    in
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   437
                      (defnames', graph')
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   438
                    end
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   439
                  else
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   440
                    (defnames', graph)
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   441
                end
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   442
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   443
            val (defnames', graph') = Symtab.foldl update_defs
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   444
                                                   ((Symtab.empty, graph), defnames)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   445
          in
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   446
            if Symtab.is_empty defnames' then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   447
              (backs, graph')
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   448
            else
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   449
              let
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   450
                val backs' = Symtab.update_new (noderef, defnames') backs
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   451
              in
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   452
                (backs', graph')
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   453
              end
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   454
          end
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   455
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   456
      val (backs, graph) = Symtab.foldl update_backrefs ((Symtab.empty, graph), backs)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   457
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   458
      (* If a Circular exception is thrown then we never reach this point. *)
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   459
      val (Node (gty, defs, _, finals, closed)) = getnode graph mainref
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   460
      val closed = if closed = Closed andalso no_forwards defs then Final else closed
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   461
      val graph = Symtab.update (mainref, Node (gty, defs, backs, finals, closed)) graph
16826
ed53f24149f6 - fixed bug concerning the renaming of axiom names
obua
parents: 16766
diff changeset
   462
      val actions' = (Define (mainref, ty, axname, orig_axname, body))::actions
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   463
    in
16384
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   464
      (cost+3, axmap, actions', graph)
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   465
    end handle ex => translate_ex axmap ex
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   466
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   467
fun define'' thy (g as (cost, axmap, actions, graph)) (mainref, ty) orig_axname body =
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   468
    let
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   469
      val ty = checkT thy ty
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   470
      fun checkbody (n, t) =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   471
          let
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   472
            val (Node (_, _, _,_, closed)) = getnode graph n
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   473
          in
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   474
            case closed of
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   475
              Final => NONE
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   476
            | _ => SOME (n, checkT thy t)
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   477
          end
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   478
      val body = distinct (List.mapPartial checkbody body)
16826
ed53f24149f6 - fixed bug concerning the renaming of axiom names
obua
parents: 16766
diff changeset
   479
      val (axmap, axname) = newaxname axmap orig_axname
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   480
    in
16826
ed53f24149f6 - fixed bug concerning the renaming of axiom names
obua
parents: 16766
diff changeset
   481
      define' (cost, axmap, actions, graph) (mainref, ty) axname orig_axname body
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   482
    end
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   483
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   484
fun finalize' (cost, axmap, history, graph) (noderef, ty) =
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   485
    case Symtab.lookup graph noderef of
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   486
      NONE => def_err ("cannot finalize constant "^noderef^"; it is not declared")
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   487
    | SOME (Node (nodety, defs, backs, finals, closed)) =>
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   488
      let
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   489
        val _ =
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   490
            if (not (is_instance_r ty nodety)) then
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   491
              def_err ("only type instances of the declared constant "^
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   492
                       noderef^" can be finalized")
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   493
            else ()
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   494
        val _ = Symtab.exists
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   495
                  (fn (def_name, Defnode (def_ty, _)) =>
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   496
                      if can_be_unified_r ty def_ty then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   497
                        def_err ("cannot finalize constant "^noderef^
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   498
                                 "; clash with definition "^def_name)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   499
                      else
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   500
                        false)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   501
                  defs
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   502
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   503
        fun update_finals [] = SOME [ty]
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   504
          | update_finals (final_ty::finals) =
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   505
            (if is_instance_r ty final_ty then NONE
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   506
             else
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   507
               case update_finals finals of
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   508
                 NONE => NONE
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   509
               | (r as SOME finals) =>
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   510
                 if (is_instance_r final_ty ty) then
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   511
                   r
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   512
                 else
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   513
                   SOME (final_ty :: finals))
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   514
      in
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   515
        case update_finals finals of
16384
90c51c932154 internalize axiom names in Defs.define; compress types via Term.compress_type
obua
parents: 16361
diff changeset
   516
          NONE => (cost, axmap, history, graph)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   517
        | SOME finals =>
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   518
          let
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   519
            val closed = if closed = Open andalso is_instance_r nodety ty then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   520
                           Closed else
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   521
                         closed
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   522
            val graph = Symtab.update (noderef, Node (nodety, defs, backs, finals, closed)) graph
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   523
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   524
            fun update_backref ((graph, backs), (backrefname, backdefnames)) =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   525
                let
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   526
                  fun update_backdef ((graph, defnames), (backdefname, _)) =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   527
                      let
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   528
                        val (backnode as Node (backty, backdefs, backbacks,
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   529
                                               backfinals, backclosed)) =
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   530
                            getnode graph backrefname
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   531
                        val (Defnode (def_ty, all_edges)) =
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   532
                            the (get_defnode backnode backdefname)
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   533
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   534
                        val (defnames', all_edges') =
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   535
                            case Symtab.lookup all_edges noderef of
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   536
                              NONE => sys_error "finalize: corrupt backref"
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   537
                            | SOME edges =>
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   538
                              let
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   539
                                val edges' = List.filter (fn (_, _, beta, _) =>
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   540
                                                             not (is_instance_r beta ty)) edges
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   541
                              in
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   542
                                if edges' = [] then
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   543
                                  (defnames, Symtab.delete noderef all_edges)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   544
                                else
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   545
                                  (Symtab.update (backdefname, ()) defnames,
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   546
                                   Symtab.update (noderef, edges') all_edges)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   547
                              end
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   548
                        val defnode' = Defnode (def_ty, all_edges')
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   549
                        val backdefs' = Symtab.update (backdefname, defnode') backdefs
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   550
                        val backclosed' = if backclosed = Closed andalso
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   551
                                             Symtab.is_empty all_edges'
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   552
                                             andalso no_forwards backdefs'
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   553
                                          then Final else backclosed
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   554
                        val backnode' =
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   555
                            Node (backty, backdefs', backbacks, backfinals, backclosed')
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   556
                      in
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   557
                        (Symtab.update (backrefname, backnode') graph, defnames')
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   558
                      end
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   559
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   560
                  val (graph', defnames') =
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   561
                      Symtab.foldl update_backdef ((graph, Symtab.empty), backdefnames)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   562
                in
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   563
                  (graph', if Symtab.is_empty defnames' then backs
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   564
                           else Symtab.update (backrefname, defnames') backs)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   565
                end
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   566
            val (graph', backs') = Symtab.foldl update_backref ((graph, Symtab.empty), backs)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   567
            val Node ( _, defs, _, _, closed) = getnode graph' noderef
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   568
            val closed = if closed = Closed andalso no_forwards defs then Final else closed
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   569
            val graph' = Symtab.update (noderef, Node (nodety, defs, backs',
17223
430edc6b7826 curried_lookup/update;
wenzelm
parents: 16982
diff changeset
   570
                                                        finals, closed)) graph'
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   571
            val history' = (Finalize (noderef, ty)) :: history
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   572
          in
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   573
            (cost+1, axmap, history', graph')
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   574
          end
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   575
      end
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   576
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   577
fun finalize'' thy g (noderef, ty) = finalize' g (noderef, checkT thy ty)
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   578
16826
ed53f24149f6 - fixed bug concerning the renaming of axiom names
obua
parents: 16766
diff changeset
   579
fun update_axname ax orig_ax (cost, axmap, history, graph) =
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   580
  (cost, Symtab.update (ax, orig_ax) axmap, history, graph)
16826
ed53f24149f6 - fixed bug concerning the renaming of axiom names
obua
parents: 16766
diff changeset
   581
16361
cb31cb768a6c further optimizations of cycle test
obua
parents: 16308
diff changeset
   582
fun merge' (Declare cty, g) = declare' g cty
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   583
  | merge' (Define (name, ty, axname, orig_axname, body), g as (cost, axmap, history, graph)) =
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   584
    (case Symtab.lookup graph name of
16826
ed53f24149f6 - fixed bug concerning the renaming of axiom names
obua
parents: 16766
diff changeset
   585
       NONE => define' (update_axname axname orig_axname g) (name, ty) axname orig_axname body
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   586
     | SOME (Node (_, defs, _, _, _)) =>
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   587
       (case Symtab.lookup defs axname of
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   588
          NONE => define' (update_axname axname orig_axname g) (name, ty) axname orig_axname body
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   589
        | SOME _ => g))
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   590
  | merge' (Finalize finals, g) = finalize' g finals
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   591
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   592
fun merge'' (g1 as (cost1, _, actions1, _)) (g2 as (cost2, _, actions2, _)) =
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   593
    if cost1 < cost2 then
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   594
      foldr merge' g2 actions1
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   595
    else
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   596
      foldr merge' g1 actions2
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   597
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   598
fun finals (_, _, history, graph) =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   599
    Symtab.foldl
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   600
      (fn (finals, (name, Node(_, _, _, ftys, _))) =>
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   601
          Symtab.update_new (name, ftys) finals)
16198
cfd070a2cc4d Integrates cycle detection in definitions with finalconsts
obua
parents: 16177
diff changeset
   602
      (Symtab.empty, graph)
16158
2c3565b74b7a Removed final_consts from theory data. Now const_deps deals with final
obua
parents: 16113
diff changeset
   603
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   604
fun overloading_info (_, axmap, _, graph) c =
16743
21dbff595bf6 1) all theorems in Orderings can now be given as a parameter
obua
parents: 16384
diff changeset
   605
    let
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   606
      fun translate (ax, Defnode (ty, _)) = (the (Symtab.lookup axmap ax), ty)
16743
21dbff595bf6 1) all theorems in Orderings can now be given as a parameter
obua
parents: 16384
diff changeset
   607
    in
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   608
      case Symtab.lookup graph c of
16743
21dbff595bf6 1) all theorems in Orderings can now be given as a parameter
obua
parents: 16384
diff changeset
   609
        NONE => NONE
21dbff595bf6 1) all theorems in Orderings can now be given as a parameter
obua
parents: 16384
diff changeset
   610
      | SOME (Node (ty, defnodes, _, _, state)) =>
21dbff595bf6 1) all theorems in Orderings can now be given as a parameter
obua
parents: 16384
diff changeset
   611
        SOME (ty, map translate (Symtab.dest defnodes), state)
21dbff595bf6 1) all theorems in Orderings can now be given as a parameter
obua
parents: 16384
diff changeset
   612
    end
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   613
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   614
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   615
(* monomorphic consts -- neither parametric nor ad-hoc polymorphism *)
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   616
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   617
fun monomorphicT (Type (_, Ts)) = forall monomorphicT Ts
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   618
  | monomorphicT _ = false
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   619
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   620
fun monomorphic (_, _, _, graph) c =
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17223
diff changeset
   621
  (case Symtab.lookup graph c of
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   622
    NONE => true
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   623
  | SOME (Node (ty, defnodes, _, _, _)) =>
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   624
      Symtab.min_key defnodes = Symtab.max_key defnodes andalso
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   625
      monomorphicT ty);
16743
21dbff595bf6 1) all theorems in Orderings can now be given as a parameter
obua
parents: 16384
diff changeset
   626
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   627
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   628
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   629
(** diagnostics **)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   630
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   631
fun pretty_const pp (c, T) =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   632
 [Pretty.str c, Pretty.str " ::", Pretty.brk 1,
16936
93772bd33871 Type.raw_instance, Type.raw_unify, Term.zero_var_indexesT;
wenzelm
parents: 16877
diff changeset
   633
  Pretty.quote (Pretty.typ pp (Type.freeze_type (Term.zero_var_indexesT T)))];
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   634
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   635
fun pretty_path pp path = fold_rev (fn (T, c, def) =>
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   636
  fn [] => [Pretty.block (pretty_const pp (c, T))]
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   637
   | prts => Pretty.block (pretty_const pp (c, T) @
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   638
      [Pretty.brk 1, Pretty.str ("depends via " ^ quote def ^ " on")]) :: prts) path [];
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   639
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   640
fun defs_circular pp path =
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   641
  Pretty.str "Cyclic dependency of definitions: " :: pretty_path pp path
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   642
  |> Pretty.chunks |> Pretty.string_of;
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   643
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   644
fun defs_infinite_chain pp path =
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   645
  Pretty.str "Infinite chain of definitions: " :: pretty_path pp path
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   646
  |> Pretty.chunks |> Pretty.string_of;
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   647
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   648
fun defs_clash def1 def2 = "Type clash in definitions " ^ quote def1 ^ " and " ^ quote def2;
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   649
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   650
fun defs_final pp const =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   651
  (Pretty.str "Attempt to define final constant" :: Pretty.brk 1 :: pretty_const pp const)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   652
  |> Pretty.block |> Pretty.string_of;
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   653
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   654
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   655
(* external interfaces *)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   656
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   657
fun declare thy const defs =
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   658
  if_none (try (declare'' thy defs) const) defs;
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   659
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   660
fun define thy const name rhs defs =
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   661
  define'' thy defs const name rhs
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   662
    handle DEFS msg => sys_error msg
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   663
      | CIRCULAR path => error (defs_circular (Sign.pp thy) path)
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   664
      | INFINITE_CHAIN path => error (defs_infinite_chain (Sign.pp thy) path)
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   665
      | CLASH (_, def1, def2) => error (defs_clash def1 def2)
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   666
      | FINAL const => error (defs_final (Sign.pp thy) const);
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   667
16982
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   668
fun finalize thy const defs =
4600e74aeb0d chain_history: turned into runtime flag;
wenzelm
parents: 16936
diff changeset
   669
  finalize'' thy defs const handle DEFS msg => sys_error msg;
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   670
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   671
fun merge pp defs1 defs2 =
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   672
  merge'' defs1 defs2
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   673
    handle CIRCULAR namess => error (defs_circular pp namess)
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   674
      | INFINITE_CHAIN namess => error (defs_infinite_chain pp namess);
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   675
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   676
end;
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   677
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   678
(*
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   679
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   680
fun tvar name = TVar ((name, 0), [])
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   681
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   682
val bool = Type ("bool", [])
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   683
val int = Type ("int", [])
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   684
val lam = Type("lam", [])
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   685
val alpha = tvar "'a"
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   686
val beta = tvar "'b"
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   687
val gamma = tvar "'c"
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   688
fun pair a b = Type ("pair", [a,b])
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   689
fun prm a = Type ("prm", [a])
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   690
val name = Type ("name", [])
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   691
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   692
val _ = print "make empty"
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   693
val g = Defs.empty
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   694
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   695
val _ = print "declare perm"
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   696
val g = Defs.declare g ("perm", prm alpha --> beta --> beta)
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   697
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   698
val _ = print "declare permF"
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   699
val g = Defs.declare g ("permF", prm alpha --> lam --> lam)
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   700
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   701
val _ = print "define perm (1)"
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   702
val g = Defs.define g ("perm", prm alpha --> (beta --> gamma) --> (beta --> gamma)) "perm_fun"
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   703
        [("perm", prm alpha --> gamma --> gamma), ("perm", prm alpha --> beta --> beta)]
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   704
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   705
val _ = print "define permF (1)"
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   706
val g = Defs.define g ("permF", prm alpha --> lam --> lam) "permF_app"
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   707
        ([("perm", prm alpha --> lam --> lam),
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   708
         ("perm", prm alpha --> lam --> lam),
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   709
         ("perm", prm alpha --> lam --> lam),
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   710
         ("perm", prm alpha --> name --> name)])
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   711
16308
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   712
val _ = print "define perm (2)"
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   713
val g = Defs.define g ("perm", prm alpha --> lam --> lam) "perm_lam"
636a1a84977a 1) Fixed bug in Defs.merge_edges_1.
obua
parents: 16198
diff changeset
   714
        [("permF", (prm alpha --> lam --> lam))]
16108
cf468b93a02e Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
obua
parents:
diff changeset
   715
16877
e92cba1d4842 tuned interfaces declare, define, finalize, merge:
wenzelm
parents: 16838
diff changeset
   716
*)