@@ -43,6 +43,14 @@ let mk_list f n =
43
43
in
44
44
mk_list' 0 []
45
45
46
+ let check_int32 v = v = Int32. to_int (Int32. of_int v)
47
+
48
+ let mk_int_expr ctx v ty =
49
+ if not (check_int32 v) then
50
+ Z3native. mk_numeral ctx (string_of_int v) ty
51
+ else
52
+ Z3native. mk_int ctx v ty
53
+
46
54
let mk_context (settings :(string * string) list ) =
47
55
let cfg = Z3native. mk_config () in
48
56
let f e = Z3native. set_param_value cfg (fst e) (snd e) in
@@ -531,7 +539,7 @@ end = struct
531
539
let mk_fresh_const (ctx :context ) (prefix :string ) (range :Sort.sort ) = Z3native. mk_fresh_const ctx prefix range
532
540
let mk_app (ctx :context ) (f :FuncDecl.func_decl ) (args :expr list ) = expr_of_func_app ctx f args
533
541
let mk_numeral_string (ctx :context ) (v :string ) (ty :Sort.sort ) = Z3native. mk_numeral ctx v ty
534
- let mk_numeral_int (ctx :context ) (v :int ) (ty :Sort.sort ) = Z3native. mk_int ctx v ty
542
+ let mk_numeral_int (ctx :context ) (v :int ) (ty :Sort.sort ) = mk_int_expr ctx v ty
535
543
let equal (a :expr ) (b :expr ) = AST. equal a b
536
544
let compare (a :expr ) (b :expr ) = AST. compare a b
537
545
end
@@ -1036,7 +1044,7 @@ struct
1036
1044
let mk_mod = Z3native. mk_mod
1037
1045
let mk_rem = Z3native. mk_rem
1038
1046
let mk_numeral_s (ctx :context ) (v :string ) = Z3native. mk_numeral ctx v (mk_sort ctx)
1039
- let mk_numeral_i (ctx :context ) (v :int ) = Z3native. mk_int ctx v (mk_sort ctx)
1047
+ let mk_numeral_i (ctx :context ) (v :int ) = mk_int_expr ctx v (mk_sort ctx)
1040
1048
let mk_int2real = Z3native. mk_int2real
1041
1049
let mk_int2bv = Z3native. mk_int2bv
1042
1050
end
@@ -1061,11 +1069,13 @@ struct
1061
1069
let mk_numeral_nd (ctx :context ) (num :int ) (den :int ) =
1062
1070
if den = 0 then
1063
1071
raise (Error " Denominator is zero" )
1072
+ else if not (check_int32 num) || not (check_int32 den) then
1073
+ raise (Error " numerals don't fit in 32 bits" )
1064
1074
else
1065
1075
Z3native. mk_real ctx num den
1066
1076
1067
1077
let mk_numeral_s (ctx :context ) (v :string ) = Z3native. mk_numeral ctx v (mk_sort ctx)
1068
- let mk_numeral_i (ctx :context ) (v :int ) = Z3native. mk_int ctx v (mk_sort ctx)
1078
+ let mk_numeral_i (ctx :context ) (v :int ) = mk_int_expr ctx v (mk_sort ctx)
1069
1079
let mk_is_integer = Z3native. mk_is_int
1070
1080
let mk_real2int = Z3native. mk_real2int
1071
1081
@@ -1155,11 +1165,6 @@ struct
1155
1165
let is_bv_xor3 (x :expr ) = (AST. is_app x) && (FuncDecl. get_decl_kind (Expr. get_func_decl x) = OP_XOR3 )
1156
1166
let get_size (x :Sort.sort ) = Z3native. get_bv_sort_size (Sort. gc x) x
1157
1167
1158
- let get_int (x :expr ) =
1159
- match Z3native. get_numeral_int (Expr. gc x) x with
1160
- | true , v -> v
1161
- | false , _ -> raise (Error " Conversion failed." )
1162
-
1163
1168
let numeral_to_string (x :expr ) = Z3native. get_numeral_string (Expr. gc x) x
1164
1169
let mk_const (ctx :context ) (name :Symbol.symbol ) (size :int ) =
1165
1170
Expr. mk_const ctx name (mk_sort ctx size)
0 commit comments