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