diff --git a/src/api/ml/Makefile b/src/api/ml/Makefile index abcefa4af..96fd0a55d 100644 --- a/src/api/ml/Makefile +++ b/src/api/ml/Makefile @@ -7,4 +7,4 @@ all: doc: *.ml mkdir -p doc - ocamldoc -html -d doc -I ../../../bld_dbg/api/ml -sort *.mli -hide Z3 + ocamldoc -html -d doc -I _build -sort *.mli -hide Z3 diff --git a/src/api/ml/z3.ml b/src/api/ml/z3.ml index c261fce05..344e542f7 100644 --- a/src/api/ml/z3.ml +++ b/src/api/ml/z3.ml @@ -2159,15 +2159,10 @@ end module Enumeration = struct type enum_sort = EnumSort of sort - - let _constdecls = Hashtbl.create 0 - let _testerdecls = Hashtbl.create 0 let sort_of_ptr ( ctx : context ) ( no : Z3native.ptr ) ( cdecls : Z3native.z3_func_decl array ) ( tdecls : Z3native.z3_func_decl array ) = let s = (sort_of_ptr ctx no) in let res = EnumSort(s) in - Hashtbl.add _constdecls res (let f e = func_decl_of_ptr ctx e in (Array.map f cdecls)) ; - Hashtbl.add _testerdecls res (let f e = func_decl_of_ptr ctx e in (Array.map f tdecls)) ; res let sort_of_enum_sort s = match s with EnumSort(x) -> x @@ -2191,33 +2186,27 @@ struct mk_sort ctx (Symbol.mk_string ctx name) (Symbol.mk_strings ctx enum_names) (** The function declarations of the constants in the enumeration. *) - let get_const_decls ( x : enum_sort ) = Hashtbl.find _constdecls x + let get_const_decls ( x : enum_sort ) = + let n = Z3native.get_datatype_sort_num_constructors (sgnc x) (sgno x) in + let f i = (func_decl_of_ptr (sgc x) (Z3native.get_datatype_sort_constructor (sgnc x) (sgno x) i)) in + Array.init n f (** The test predicates for the constants in the enumeration. *) - let get_tester_decls ( x : enum_sort ) = Hashtbl.find _testerdecls x + let get_tester_decls ( x : enum_sort ) = + let n = Z3native.get_datatype_sort_num_constructors (sgnc x) (sgno x) in + let f i = (func_decl_of_ptr (sgc x) (Z3native.get_datatype_sort_recognizer (sgnc x) (sgno x) i)) in + Array.init n f + end (** Functions to manipulate List expressions *) module List_ = struct type list_sort = ListSort of sort - - let _nildecls = Hashtbl.create 0 - let _is_nildecls = Hashtbl.create 0 - let _consdecls = Hashtbl.create 0 - let _is_consdecls = Hashtbl.create 0 - let _headdecls = Hashtbl.create 0 - let _taildecls = Hashtbl.create 0 let sort_of_ptr ( ctx : context ) ( no : Z3native.ptr ) ( nildecl : Z3native.ptr ) ( is_nildecl : Z3native.ptr ) ( consdecl : Z3native.ptr ) ( is_consdecl : Z3native.ptr ) ( headdecl : Z3native.ptr ) ( taildecl : Z3native.ptr ) = let s = (sort_of_ptr ctx no) in let res = ListSort(s) in - Hashtbl.add _nildecls res (func_decl_of_ptr ctx nildecl) ; - Hashtbl.add _is_nildecls res (func_decl_of_ptr ctx is_nildecl) ; - Hashtbl.add _consdecls res (func_decl_of_ptr ctx consdecl) ; - Hashtbl.add _is_consdecls res (func_decl_of_ptr ctx is_consdecl) ; - Hashtbl.add _headdecls res (func_decl_of_ptr ctx headdecl) ; - Hashtbl.add _taildecls res (func_decl_of_ptr ctx taildecl) ; res let sort_of_list_sort s = match s with ListSort(x) -> x @@ -2237,22 +2226,28 @@ struct mk_sort ctx (Symbol.mk_string ctx name) elem_sort (** The declaration of the nil function of this list sort. *) - let get_nil_decl ( x : list_sort ) = (Hashtbl.find _nildecls x) + let get_nil_decl ( x : list_sort ) = + func_decl_of_ptr (sgc x) (Z3native.get_datatype_sort_constructor (sgnc x) (sgno x) 0) (** The declaration of the isNil function of this list sort. *) - let get_is_nil_decl ( x : list_sort ) = (Hashtbl.find _is_nildecls x) + let get_is_nil_decl ( x : list_sort ) = + func_decl_of_ptr (sgc x) (Z3native.get_datatype_sort_recognizer (sgnc x) (sgno x) 0) (** The declaration of the cons function of this list sort. *) - let get_cons_decl ( x : list_sort ) = (Hashtbl.find _consdecls x) + let get_cons_decl ( x : list_sort ) = + func_decl_of_ptr (sgc x) (Z3native.get_datatype_sort_constructor (sgnc x) (sgno x) 1) (** The declaration of the isCons function of this list sort. *) - let get_is_cons_decl ( x : list_sort ) = (Hashtbl.find _is_consdecls x) + let get_is_cons_decl ( x : list_sort ) = + func_decl_of_ptr (sgc x) (Z3native.get_datatype_sort_recognizer (sgnc x) (sgno x) 1) (** The declaration of the head function of this list sort. *) - let get_head_decl ( x : list_sort ) = (Hashtbl.find _headdecls x) + let get_head_decl ( x : list_sort ) = + func_decl_of_ptr (sgc x) (Z3native.get_datatype_sort_constructor_accessor (sgnc x) (sgno x) 1 0) (** The declaration of the tail function of this list sort. *) - let get_tail_decl ( x : list_sort ) = (Hashtbl.find _taildecls x) + let get_tail_decl ( x : list_sort ) = + func_decl_of_ptr (sgc x) (Z3native.get_datatype_sort_constructor_accessor (sgnc x) (sgno x) 1 1) (** The empty list. *) let nil ( x : list_sort ) = expr_of_func_app (sgc x) (get_nil_decl x) [||] diff --git a/src/api/ml/z3.mli b/src/api/ml/z3.mli index 5b1b2073a..87318d2a7 100644 --- a/src/api/ml/z3.mli +++ b/src/api/ml/z3.mli @@ -5,9 +5,9 @@ @author CM Wintersteiger (cwinter) 2012-12-17 *) -type context -(** Create a context object. + +(** Context objects. Most interactions with Z3 are interpreted in some context; many users will only require one such object, but power users may require more than one. To start using @@ -27,6 +27,9 @@ type context (...) *) +type context + +(** Create a context object *) val mk_context : (string * string) list -> context