diff --git a/src/api/ml/z3.ml b/src/api/ml/z3.ml
index 3a0e9208e..116d7a230 100644
--- a/src/api/ml/z3.ml
+++ b/src/api/ml/z3.ml
@@ -33,11 +33,11 @@ object (self)
val mutable m_obj_cnt : int = 0
initializer
- (* Printf.printf "Installing finalizer on context %d \n" (Oo.id self) ; *)
- let f = fun o -> o#dispose in
- let v = self in
- Gc.finalise f v
-
+ (* Printf.printf "Installing finalizer on context %d \n" (Oo.id self) ; *)
+ let f = fun o -> o#dispose in
+ let v = self in
+ Gc.finalise f v
+
method dispose : unit =
if m_obj_cnt == 0 then (
(* Printf.printf "Disposing context %d \n" (Oo.id self) ; *)
@@ -110,7 +110,6 @@ object (self)
method decref ctx o = Z3native.params_dec_ref ctx o
end
-
(** Symbol objects *)
class symbol ctx =
object (self)
@@ -166,6 +165,10 @@ object (self)
method cnstr_obj obj = (self#sno ctx obj) ; self
end
+let sortaton (a : sort array) =
+ let f (e : sort) = e#gno in
+ Array.map f a
+
(** Arithmetic sort objects, i.e., Int or Real. *)
class arith_sort ctx =
object (self)
@@ -195,20 +198,12 @@ object (self)
method cnstr_obj obj = (self#sno ctx obj) ; self
end
-(** Datatype sort objects *)
-class datatype_sort ctx =
-object (self)
- inherit sort ctx as super
- method cnstr_obj obj = (self#sno ctx obj) ; self
- method cnstr_sc (name : symbol) constructors = (self#sno ctx (fst (Z3native.mk_datatype ctx#gno name#gno (Array.length constructors) (astaton constructors)))) ; self
-end
-
(** Enum sort objects *)
class enum_sort ctx =
object (self)
inherit sort ctx as super
- val mutable _constdecls = None
- val mutable _testerdecls = None
+ val mutable _constdecls : Z3native.ptr array option = None
+ val mutable _testerdecls : Z3native.ptr array option = None
method cnstr_obj obj = (self#sno ctx obj) ; self
method cnstr_ss (name : symbol) (enum_names : symbol array) =
let (r, a, b) = (Z3native.mk_enumeration_sort ctx#gno name#gno (Array.length enum_names) (symbolaton enum_names)) in
@@ -267,12 +262,12 @@ end
class list_sort ctx =
object (self)
inherit sort ctx as super
- val mutable _nildecl = None
- val mutable _is_nildecl = None
- val mutable _consdecl = None
- val mutable _is_consdecl = None
- val mutable _headdecl = None
- val mutable _taildecl = None
+ val mutable _nildecl : Z3native.ptr option = None
+ val mutable _is_nildecl : Z3native.ptr option = None
+ val mutable _consdecl : Z3native.ptr option = None
+ val mutable _is_consdecl : Z3native.ptr option = None
+ val mutable _headdecl : Z3native.ptr option = None
+ val mutable _taildecl : Z3native.ptr option = None
method cnstr_obj obj = (self#sno ctx obj) ; self
method cnstr_ss (name : symbol) (elem_sort : sort) =
let (r, a, b, c, d, e, f) = (Z3native.mk_list_sort ctx#gno name#gno elem_sort#gno) in
@@ -291,23 +286,23 @@ object (self)
method is_nil_decl = match _is_nildecl with
| Some(x) -> x
- | None -> raise (Z3native.Exception "Missing is_nil decls")
+ | None -> raise (Z3native.Exception "Missing is_nil decl")
method cons_decl = match _consdecl with
| Some(x) -> x
- | None -> raise (Z3native.Exception "Missing cons decls")
+ | None -> raise (Z3native.Exception "Missing cons decl")
method is_cons_decl = match _is_consdecl with
| Some(x) -> x
- | None -> raise (Z3native.Exception "Missing is_cons decls")
+ | None -> raise (Z3native.Exception "Missing is_cons decl")
method head_decl = match _headdecl with
| Some(x) -> x
- | None -> raise (Z3native.Exception "Missing head decls")
+ | None -> raise (Z3native.Exception "Missing head decl")
method tail_decl = match _taildecl with
| Some(x) -> x
- | None -> raise (Z3native.Exception "Missing tail decls")
+ | None -> raise (Z3native.Exception "Missing tail decl")
end
@@ -330,18 +325,6 @@ object (self)
self
end
-let create_sort ctx obj =
- match (int2sort_kind (Z3native.get_sort_kind ctx#gno obj)) with
- | ARRAY_SORT -> (((new array_sort ctx)#cnstr_obj obj) :> sort)
- | BOOL_SORT -> (((new bool_sort ctx)#cnstr_obj obj) :> sort)
- | BV_SORT -> (((new bitvec_sort ctx)#cnstr_obj obj) :> sort)
- | DATATYPE_SORT -> (((new datatype_sort ctx)#cnstr_obj obj) :> sort)
- | INT_SORT -> (((new int_sort ctx)#cnstr_obj obj) :> sort)
- | REAL_SORT -> (((new real_sort ctx)#cnstr_obj obj) :> sort)
- | UNINTERPRETED_SORT -> (((new uninterpreted_sort ctx)#cnstr_obj obj) :> sort)
- | FINITE_DOMAIN_SORT -> (((new finite_domain_sort ctx)#cnstr_obj obj) :> sort)
- | RELATION_SORT -> (((new relation_sort ctx)#cnstr_obj obj) :> sort)
- | UNKNOWN_SORT -> raise (Z3native.Exception "Unknown sort kind encountered")
(** Function declaration objects *)
class func_decl ctx =
@@ -392,6 +375,126 @@ object (self)
method rational = m_r
end
+
+(** Constructor objects *)
+class constructor ctx =
+object (self)
+ inherit z3object ctx None as super
+ val mutable m_n : int = 0
+ val mutable m_tester_decl : func_decl option = None
+ val mutable m_constructor_decl : func_decl option = None
+ val mutable m_accessor_decls : func_decl array option = None
+ method incref ctx o = ()
+ method decref ctx o = ()
+ initializer
+ let f = fun o -> Z3native.del_constructor o#gnc o#gno in
+ let v = self in
+ Gc.finalise f v
+
+ method cnstr_ssssi (name : symbol) (recognizer : symbol) (field_names : symbol array) (sorts : sort array) (sort_refs : int array) =
+ m_n <- (Array.length field_names) ;
+ if m_n != (Array.length sorts) then
+ raise (Z3native.Exception "Number of field names does not match number of sorts")
+ else
+ if m_n != (Array.length sort_refs) then
+ raise (Z3native.Exception "Number of field names does not match number of sort refs")
+ else
+ let o = (Z3native.mk_constructor ctx#gno name#gno recognizer#gno m_n (symbolaton field_names)
+ (sortaton sorts)
+ sort_refs) in
+ self#sno ctx o ;
+ self
+
+ method private init =
+ match m_tester_decl with
+ | None ->
+ let (a, b, c) = (Z3native.query_constructor self#gnc self#gno m_n) in
+ m_constructor_decl <- Some ((new func_decl ctx)#cnstr_obj a) ;
+ m_tester_decl <- Some ((new func_decl ctx)#cnstr_obj b) ;
+ m_accessor_decls <- Some (let f e = ((new func_decl ctx)#cnstr_obj e) in Array.map f c) ;
+ ()
+ | _ -> ()
+
+ method get_n = m_n
+
+ method tester_decl = match m_tester_decl with
+ | Some(x) -> x
+ | None -> self#init ; self#tester_decl
+
+ method constructor_decl = match m_constructor_decl with
+ | Some(x) -> x
+ | None -> self#init ; self#constructor_decl
+
+ method accessor_decls = match m_accessor_decls with
+ | Some(x) -> x
+ | None -> self#init ; self#accessor_decls
+end
+
+let constructoraton (a : constructor array) =
+ let f (e : constructor) = e#gno in
+ Array.map f a
+
+(** Constructor list objects *)
+class constructor_list ctx =
+object (self)
+ inherit z3object ctx None
+ method incref ctx o = ()
+ method decref ctx o = ()
+ initializer
+ let f = fun o -> Z3native.del_constructor_list o#gnc o#gno in
+ let v = self in
+ Gc.finalise f v
+ method cnstr_obj obj = (self#sno ctx obj) ; self
+ method cnstr_ca ( c : constructor array ) =
+ self#sno ctx (Z3native.mk_constructor_list ctx#gno (Array.length c) (constructoraton c)) ;
+ self
+end
+
+let constructor_listaton (a : constructor_list array) =
+ let f (e : constructor_list) = e#gno in
+ Array.map f a
+
+(** Datatype sort objects *)
+class datatype_sort ctx =
+object (self)
+ inherit sort ctx as super
+ method cnstr_obj obj = (self#sno ctx obj) ; self
+ method cnstr_sc (name : symbol) (constructors : constructor array) = (self#sno ctx (fst (Z3native.mk_datatype ctx#gno name#gno (Array.length constructors) (constructoraton constructors)))) ; self
+end
+
+let create_sort ctx obj =
+ match (int2sort_kind (Z3native.get_sort_kind ctx#gno obj)) with
+ | ARRAY_SORT -> (((new array_sort ctx)#cnstr_obj obj) :> sort)
+ | BOOL_SORT -> (((new bool_sort ctx)#cnstr_obj obj) :> sort)
+ | BV_SORT -> (((new bitvec_sort ctx)#cnstr_obj obj) :> sort)
+ | DATATYPE_SORT -> (((new datatype_sort ctx)#cnstr_obj obj) :> sort)
+ | INT_SORT -> (((new int_sort ctx)#cnstr_obj obj) :> sort)
+ | REAL_SORT -> (((new real_sort ctx)#cnstr_obj obj) :> sort)
+ | UNINTERPRETED_SORT -> (((new uninterpreted_sort ctx)#cnstr_obj obj) :> sort)
+ | FINITE_DOMAIN_SORT -> (((new finite_domain_sort ctx)#cnstr_obj obj) :> sort)
+ | RELATION_SORT -> (((new relation_sort ctx)#cnstr_obj obj) :> sort)
+ | UNKNOWN_SORT -> raise (Z3native.Exception "Unknown sort kind encountered")
+
+(** AST vector objects *)
+class ast_vector ctx =
+object (self)
+ inherit z3object ctx None
+ method cnstr_obj obj = (self#sno ctx obj) ; self
+ method incref ctx o = Z3native.ast_vector_inc_ref ctx o
+ method decref ctx o = Z3native.ast_vector_dec_ref ctx o
+end
+
+
+(** AST map objects *)
+class ast_map ctx =
+object (self)
+ inherit z3object ctx None
+ method cnstr_obj obj = (self#sno ctx obj) ; self
+ method incref ctx o = Z3native.ast_map_inc_ref ctx o
+ method decref ctx o = Z3native.ast_map_dec_ref ctx o
+end
+
+
(** Expression objects *)
class expr ctx =
object(self)
@@ -492,7 +595,8 @@ end
(**/**)
-(** Interaction logging for Z3.
+(** Interaction logging for Z3
+
Note that this is a global, static log and if multiple Context
objects are created, it logs the interaction with all of them. *)
module Log =
@@ -512,7 +616,7 @@ struct
let append s = Z3native.append_log s
end
-(** Version information. *)
+(** Version information *)
module Version =
struct
(** The major version. *)
@@ -536,7 +640,7 @@ struct
string_of_int rev ^ "."
end
-(** Symbols are used to name several term and type constructors. *)
+(** Symbols are used to name several term and type constructors *)
module Symbol =
struct
(** The kind of the symbol (int or string) *)
@@ -562,9 +666,7 @@ struct
end
-(**
- The Sort module implements type information for ASTs.
-*)
+(** The Sort module implements type information for ASTs *)
module Sort =
struct
(**
@@ -612,13 +714,13 @@ struct
end
(** Bit-vector sorts *)
-module BitVectorSort =
+module BitVecSort =
struct
(** The size of the bit-vector sort. *)
let get_size (x : bitvec_sort) = Z3native.get_bv_sort_size x#gnc x#gno
end
-(** Finite domain sorts. *)
+(** Finite domain sorts *)
module FiniteDomainSort =
struct
(** The size of the finite domain sort. *)
@@ -628,7 +730,7 @@ struct
else raise (Z3native.Exception "Conversion failed.")
end
-(** Relation sorts. *)
+(** Relation sorts *)
module RelationSort =
struct
(** The arity of the relation sort. *)
@@ -684,60 +786,60 @@ let create_ast ctx no =
| UNKNOWN_AST -> raise (Z3native.Exception "Cannot create asts of type unknown")
(**/**)
-(** Function declarations. *)
+(** Function declarations *)
module FuncDecl =
struct
-(** Parameters of Func_Decls *)
+ (** Parameters of Func_Decls *)
module Parameter =
struct
- (**
- The kind of the parameter.
- *)
+ (**
+ The kind of the parameter.
+ *)
let get_kind (x : parameter) = x#kind
- (**The int value of the parameter.*)
+ (**The int value of the parameter.*)
let get_int (x : parameter) =
if (x#kind != PARAMETER_INT) then
raise (Z3native.Exception "parameter is not an int")
else
x#int
- (**The double value of the parameter.*)
+ (**The double value of the parameter.*)
let get_double (x : parameter) =
if (x#kind != PARAMETER_DOUBLE) then
raise (Z3native.Exception "parameter is not a double")
else
x#double
- (**The Symbol value of the parameter.*)
+ (**The Symbol value of the parameter.*)
let get_symbol (x : parameter) =
if (x#kind != PARAMETER_SYMBOL) then
raise (Z3native.Exception "parameter is not a symbol")
else
x#symbol
- (**The Sort value of the parameter.*)
+ (**The Sort value of the parameter.*)
let get_sort (x : parameter) =
if (x#kind != PARAMETER_SORT) then
raise (Z3native.Exception "parameter is not a sort")
else
x#sort
- (**The AST value of the parameter.*)
+ (**The AST value of the parameter.*)
let get_ast (x : parameter) =
if (x#kind != PARAMETER_AST) then
raise (Z3native.Exception "parameter is not an ast")
else
x#ast
- (**The FunctionDeclaration value of the parameter.*)
+ (**The FunctionDeclaration value of the parameter.*)
let get_ast (x : parameter) =
if (x#kind != PARAMETER_FUNC_DECL) then
raise (Z3native.Exception "parameter is not an function declaration")
else
x#func_decl
- (**The rational string value of the parameter.*)
+ (**The rational string value of the parameter.*)
let get_rational (x : parameter) =
if (x#kind != PARAMETER_RATIONAL) then
raise (Z3native.Exception "parameter is not a ratinoal string")
@@ -826,7 +928,7 @@ struct
(**
Create expression that applies function to arguments.
-
+ @param args The arguments
*)
let apply (x : func_decl) (args : expr array) = create_expr_fa x#gc x args
@@ -862,7 +964,7 @@ struct
Array.init n f
end
-(** Enumeration sorts. *)
+(** Enumeration sorts *)
module EnumSort =
struct
(** The function declarations of the constants in the enumeration. *)
@@ -876,7 +978,7 @@ struct
Array.map f x#tester_decls
end
-(** List sorts. *)
+(** List sorts *)
module ListSort =
struct
(** The declaration of the nil function of this list sort. *)
@@ -901,6 +1003,7 @@ struct
let nil (x : list_sort) = create_expr_fa x#gc (get_nil_decl x) [||]
end
+(** Tuple sorts *)
module TupleSort =
struct
(** The constructor function of the tuple.*)
@@ -917,7 +1020,7 @@ struct
Array.init n f
end
-(** The abstract syntax tree (AST) module. *)
+(** The abstract syntax tree (AST) module *)
module AST =
struct
(**
@@ -1077,12 +1180,107 @@ struct
let to_string (p : params) = Z3native.params_to_string p#gnc p#gno
end
+(** Vectors of ASTs *)
+module ASTVector =
+struct
+ (** The size of the vector *)
+ let get_size ( x : ast_vector ) =
+ Z3native.ast_vector_size x#gnc x#gno
+
+ (**
+ Retrieves the i-th object in the vector.
+ @param i Index
+ @return An AST
+ *)
+ let get ( x : ast_vector ) ( i : int ) =
+ create_ast x#gc (Z3native.ast_vector_get x#gnc x#gno i)
+
+ (** Sets the i-th object in the vector. *)
+ let set ( x : ast_vector ) ( i : int ) ( value : ast ) =
+ Z3native.ast_vector_set x#gnc x#gno i value#gno
+
+ (** Resize the vector to .
+ @param newSize The new size of the vector. *)
+ let resize ( x : ast_vector ) ( new_size : int ) =
+ Z3native.ast_vector_resize x#gnc x#gno new_size
+
+ (**
+ Add the AST to the back of the vector. The size
+ is increased by 1.
+ @param a An AST
+ *)
+ let push ( x : ast_vector ) ( a : ast ) =
+ Z3native.ast_vector_push x#gnc x#gno a#gno
+
+ (**
+ Translates all ASTs in the vector to .
+ @param to_ctx A context
+ @return A new ASTVector
+ *)
+ let translate ( x : ast_vector ) ( to_ctx : context ) =
+ (new ast_vector to_ctx)#cnstr_obj (Z3native.ast_vector_translate x#gnc x#gno to_ctx#gno)
+
+ (** Retrieves a string representation of the vector. *)
+ let to_string ( x : ast_vector ) =
+ Z3native.ast_vector_to_string x#gnc x#gno
+end
+
+(** Map from AST to AST *)
+module ASTMap =
+struct
+ (** Checks whether the map contains the key .
+ @param k An AST
+ @return True if is a key in the map, false otherwise. *)
+ let contains ( m : ast_map ) ( key : ast ) =
+ (int2lbool (Z3native.ast_map_contains m#gnc m#gno key#gno)) == L_TRUE
+
+ (** Finds the value associated with the key .
+
+ This function signs an error when is not a key in the map.
+
+ @param k An AST
+ *)
+ let find ( m : ast_map ) ( key : ast ) =
+ create_ast m#gc (Z3native.ast_map_find m#gnc m#gno key#gno)
+
+ (**
+ Stores or replaces a new key/value pair in the map.
+ @param k The key AST
+ @param v The value AST
+ *)
+ let insert ( m : ast_map ) ( key : ast ) ( value : ast) =
+ Z3native.ast_map_insert m#gnc m#gno key#gno value#gno
+
+ (**
+ Erases the key from the map.
+ @param k An AST
+ *)
+ let erase ( m : ast_map ) ( key : ast ) =
+ Z3native.ast_map_erase m#gnc m#gno key#gno
+
+ (** Removes all keys from the map. *)
+ let reset ( m : ast_map ) =
+ Z3native.ast_map_reset m#gnc m#gno
+
+ (** The size of the map *)
+ let get_size ( m : ast_map ) =
+ Z3native.ast_map_size m#gnc m#gno
+
+ (** The keys stored in the map. *)
+ let get_keys ( m : ast_map ) =
+ (new ast_vector m#gc)#cnstr_obj (Z3native.ast_map_keys m#gnc m#gno)
+
+ (** Retrieves a string representation of the map.*)
+ let to_strnig ( m : ast_map ) =
+ Z3native.ast_map_to_string m#gnc m#gno
+end
+
(** Expressions (terms) *)
module Expr =
struct
(**
Returns a simplified version of the expression.
- A set of parameters to configure the simplifier
+ @param p A set of parameters to configure the simplifier
*)
let simplify ( x : expr ) ( p : params option ) = match p with
@@ -1155,8 +1353,8 @@ struct
(**
Translates (copies) the term to the Context .
- A context
- A copy of the term which is associated with
+ @param ctx A context
+ @return A copy of the term which is associated with
*)
let translate ( x : expr ) to_ctx =
if x#gc == to_ctx then
@@ -1176,7 +1374,7 @@ struct
(**
Indicates whether the term is well-sorted.
- True if the term is well-sorted, false otherwise.
+ @return True if the term is well-sorted, false otherwise.
*)
let is_well_sorted ( x : expr ) = int2lbool (Z3native.is_well_sorted x#gnc x#gno) == L_TRUE
@@ -2372,13 +2570,13 @@ struct
Z3native.get_index_value x#gnc x#gno
end
-(* Integer Numerals *)
+(** Integer Numerals *)
module IntNum =
struct
(** Retrieve the int value. *)
let get_int ( x : int_num ) = let (r, v) = Z3native.get_numeral_int x#gnc x#gno in
- if int2lbool(r) == L_TRUE then v
- else raise (Z3native.Exception "Conversion failed.")
+ if int2lbool(r) == L_TRUE then v
+ else raise (Z3native.Exception "Conversion failed.")
(** Returns a string representation of the numeral. *)
let to_string ( x : int_num ) = Z3native.get_numeral_string x#gnc x#gno
@@ -2410,9 +2608,9 @@ module BitVecNum =
struct
(** Retrieve the int value. *)
let get_int ( x : bitvec_num ) = let (r, v) = Z3native.get_numeral_int x#gnc x#gno in
- if int2lbool(r) == L_TRUE then v
- else raise (Z3native.Exception "Conversion failed.")
-
+ if int2lbool(r) == L_TRUE then v
+ else raise (Z3native.Exception "Conversion failed.")
+
(** Returns a string representation of the numeral. *)
let to_string ( x : bitvec_num ) = Z3native.get_numeral_string x#gnc x#gno
end
@@ -2424,9 +2622,8 @@ struct
Return a upper bound for a given real algebraic number.
The interval isolating the number is smaller than 1/10^.
-
- the precision of the result
- A numeral Expr of sort Real
+ @param precision the precision of the result
+ @return A numeral Expr of sort Real
*)
let to_upper ( x : algebraic_num ) ( precision : int ) =
(new rat_num x#gc)#cnstr_obj (Z3native.get_algebraic_number_upper x#gnc x#gno precision)
@@ -2435,9 +2632,8 @@ struct
Return a lower bound for the given real algebraic number.
The interval isolating the number is smaller than 1/10^.
-
-
- A numeral Expr of sort Real
+ @param precision the precision of the result
+ @return A numeral Expr of sort Real
*)
let to_lower ( x : algebraic_num ) precision =
(new rat_num x#gc)#cnstr_obj (Z3native.get_algebraic_number_lower x#gnc x#gno precision)
@@ -2450,8 +2646,24 @@ struct
(** Returns a string representation of the numeral. *)
let to_string ( x : algebraic_num ) = Z3native.get_numeral_string x#gnc x#gno
end
+
+(** Constructors are used for datatype sorts *)
+module Constructor =
+struct
+ (** The number of fields of the constructor. *)
+ let get_num_fields ( x : constructor ) = x#get_n
+
+ (** The function declaration of the constructor. *)
+ let get_constructor_decl ( x : constructor ) = x#constructor_decl
+
+ (** The function declaration of the tester. *)
+ let get_tester_decl ( x : constructor ) = x#tester_decl
+
+ (** The function declarations of the accessors *)
+ let get_accessor_decls ( x : constructor ) = x#accessor_decls
+end
-(** The main interaction with Z3 happens via the Context module. *)
+(** The main interaction with Z3 happens via the Context module *)
module Context =
struct
@@ -2551,151 +2763,95 @@ struct
(Array.map f (mk_symbols_string ( ctx : context ) enum_names))
)
- (**
- Create a new list sort.
- *)
+ (**
+ Create a new list sort.
+ *)
let mk_list_sort ( ctx : context ) (name : symbol) elem_sort =
- (new list_sort ctx)#cnstr_ss name elem_sort
+ (new list_sort ctx)#cnstr_ss name elem_sort
- (**
- Create a new list sort.
- *)
+ (**
+ Create a new list sort.
+ *)
let mk_list_sort_s ( ctx : context ) (name : string) elem_sort =
mk_list_sort ctx ((mk_symbol_string ctx name) :> symbol) elem_sort
- (**
- Create a new finite domain sort.
- *)
+ (**
+ Create a new finite domain sort.
+ *)
let mk_finite_domain_sort ( ctx : context ) ( name : symbol ) size =
(new finite_domain_sort ctx)#cnstr_si name size
- (**
- Create a new finite domain sort.
- *)
+ (**
+ Create a new finite domain sort.
+ *)
let mk_finite_domain_sort_s ( ctx : context ) ( name : string ) size =
(new finite_domain_sort ctx)#cnstr_si ((mk_symbol_string ctx name) :> symbol) size
-(**
-
-(* DATATYPES *)
-(**
- Create a datatype constructor.
-*)
- @param name constructor name
- @param recognizer name of recognizer function.
- @param fieldNames names of the constructor fields.
- @param sorts field sorts, 0 if the field sort refers to a recursive sort.
- @param sortRefs reference to datatype sort that is an argument to the constructor;
- if the corresponding sort reference is 0, then the value in sort_refs should be an index
- referring to one of the recursive datatypes that is declared.
- public Constructor MkConstructor(Symbol name, Symbol recognizer, Symbol[] fieldNames = null, Sort[] sorts = null, uint[] sortRefs = null)
- {
+ (* DATATYPES *)
+ (**
+ Create a datatype constructor.
+ @param name constructor name
+ @param recognizer name of recognizer function.
+ @param fieldNames names of the constructor fields.
+ @param sorts field sorts, 0 if the field sort refers to a recursive sort.
+ @param sortRefs reference to datatype sort that is an argument to the constructor;
+ if the corresponding sort reference is 0, then the value in sort_refs should be an index
+ referring to one of the recursive datatypes that is declared.
+ *)
+ let mk_constructor ( ctx : context ) ( name : symbol ) ( recognizer : symbol ) ( field_names : symbol array ) ( sorts : sort array ) ( sort_refs : int array) =
+ (new constructor ctx)#cnstr_ssssi name recognizer field_names sorts sort_refs
+ (**
+ Create a datatype constructor.
+ @param name constructor name
+ @param recognizer name of recognizer function.
+ @param fieldNames names of the constructor fields.
+ @param sorts field sorts, 0 if the field sort refers to a recursive sort.
+ @param sortRefs reference to datatype sort that is an argument to the constructor;
+ if the corresponding sort reference is 0, then the value in sort_refs should be an index
+ referring to one of the recursive datatypes that is declared.
+ *)
+ let mk_constructor_s ( ctx : context ) ( name : string ) ( recognizer : symbol ) ( field_names : symbol array ) ( sorts : sort array ) ( sort_refs : int array) =
+ mk_constructor ctx ((mk_symbol_string ctx name) :> symbol) recognizer field_names sorts sort_refs
- return new Constructor(this, name, recognizer, fieldNames, sorts, sortRefs);
- }
+ (**
+ Create a new datatype sort.
+ *)
+ let mk_datatype_sort ( ctx : context ) ( name : symbol ) ( constructors : constructor array) =
+ (new datatype_sort ctx)#cnstr_sc name constructors
+
+ (**
+ Create a new datatype sort.
+ *)
+ let mk_datatype_sort_s ( ctx : context ) ( name : string ) ( constructors : constructor array) =
+ mk_datatype_sort ctx ((mk_symbol_string ctx name) :> symbol) constructors
+
+ (**
+ Create mutually recursive datatypes.
+ @param names names of datatype sorts
+ @param c list of constructors, one list per sort.
+ *)
+ let mk_datatype_sorts ( ctx : context ) ( names : symbol array ) ( c : constructor array array ) =
+ let n = (Array.length names) in
+ let f e = ( (new constructor_list ctx)#cnstr_ca e ) in
+ let cla = (Array.map f c) in
+ let (r, a) = (Z3native.mk_datatypes ctx#gno n (symbolaton names) (constructor_listaton cla)) in
+ let g e = ( (new datatype_sort ctx)#cnstr_obj e) in
+ (Array.map g r)
+
+ (** Create mutually recursive data-types. *)
+ let mk_datatype_sorts_s ( ctx : context ) ( names : string array ) ( c : constructor array array ) =
+ mk_datatype_sorts ctx
+ (
+ let f e = ((mk_symbol_string ctx e) :> symbol) in
+ Array.map f names
+ )
+ c
(**
- Create a datatype constructor.
-*)
- @param name
- @param recognizer
- @param fieldNames
- @param sorts
- @param sortRefs
- @return
- public Constructor MkConstructor(string name, string recognizer, string[] fieldNames = null, Sort[] sorts = null, uint[] sortRefs = null)
- {
-
-
- return new Constructor(this, MkSymbol(name), MkSymbol(recognizer), MkSymbols(fieldNames), sorts, sortRefs);
- }
-
-(**
- Create a new datatype sort.
-*)
- let mk_Datatype_Sort(Symbol name, Constructor[] constructors)
- {
-
-
-
-
-
-
- CheckContextMatch(name);
- CheckContextMatch(constructors);
- return new DatatypeSort(this, name, constructors);
- }
-
-(**
- Create a new datatype sort.
-*)
- let mk_Datatype_Sort(string name, Constructor[] constructors)
- {
-
-
-
-
- CheckContextMatch(constructors);
- return new DatatypeSort(this, MkSymbol(name), constructors);
- }
-
-(**
- Create mutually recursive datatypes.
-*)
- @param names names of datatype sorts
- @param c list of constructors, one list per sort.
- let mk_Datatype_Sorts(Symbol[] names, Constructor[][] c)
- {
-
-
-
-
-
-
-
- CheckContextMatch(names);
- uint n = (uint)names.Length;
- ConstructorList[] cla = new ConstructorList[n];
- IntPtr[] n_constr = new IntPtr[n];
- for (uint i = 0; i < n; i++)
- {
- Constructor[] constructor = c[i];
-
- CheckContextMatch(constructor);
- cla[i] = new ConstructorList(this, constructor);
- n_constr[i] = cla[i].x#gno;
- }
- IntPtr[] n_res = new IntPtr[n];
- Z3native.mk_datatypes(nCtx, n, Symbol.ArrayToNative(names), n_res, n_constr);
- DatatypeSort[] res = new DatatypeSort[n];
- for (uint i = 0; i < n; i++)
- res[i] = new DatatypeSort(this, n_res[i]);
- return res;
- }
-
-(**
- Create mutually recursive data-types.
-*)
- @param names
- @param c
- @return
- let mk_Datatype_Sorts(string[] names, Constructor[][] c)
- {
-
-
-
-
-
-
-
- return MkDatatypeSorts(MkSymbols(names), c);
- }
-
-
(* FUNCTION DECLARATIONS *)