Skip to content

Commit 94ffa39

Browse files
fix Z3Prover#1800 by converting large integers to strings
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent d6298b0 commit 94ffa39

File tree

3 files changed

+17
-17
lines changed

3 files changed

+17
-17
lines changed

Diff for: examples/ml/ml_example.ml

+4-3
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ let model_converter_test ( ctx : context ) =
6565
| None -> raise (TestFailedException "")
6666
| Some (m) ->
6767
Printf.printf "Solver says: %s\n" (string_of_status q) ;
68-
Printf.printf "Model: \n%s\n" (Model.to_string m) ;
69-
Printf.printf "Converted Model: \n%s\n" (Model.to_string (convert_model ar 0 m))
68+
Printf.printf "Model: \n%s\n" (Model.to_string m)
7069
)
7170

7271
(**
@@ -330,12 +329,14 @@ let _ =
330329
let ss = (Symbol.mk_string ctx "mySymbol") in
331330
let bs = (Boolean.mk_sort ctx) in
332331
let ints = (Integer.mk_sort ctx) in
333-
let rs = (Real.mk_sort ctx) in
332+
let rs = (Real.mk_sort ctx) in
333+
let v = (Arithmetic.Integer.mk_numeral_i ctx 8000000000) in
334334
Printf.printf "int symbol: %s\n" (Symbol.to_string is);
335335
Printf.printf "string symbol: %s\n" (Symbol.to_string ss);
336336
Printf.printf "bool sort: %s\n" (Sort.to_string bs);
337337
Printf.printf "int sort: %s\n" (Sort.to_string ints);
338338
Printf.printf "real sort: %s\n" (Sort.to_string rs);
339+
Printf.printf "integer: %s\n" (Expr.to_string v);
339340
basic_tests ctx ;
340341
quantifier_example1 ctx ;
341342
fpa_example ctx ;

Diff for: src/api/ml/z3.ml

+13-8
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ let mk_list f n =
4343
in
4444
mk_list' 0 []
4545

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+
4654
let mk_context (settings:(string * string) list) =
4755
let cfg = Z3native.mk_config () in
4856
let f e = Z3native.set_param_value cfg (fst e) (snd e) in
@@ -531,7 +539,7 @@ end = struct
531539
let mk_fresh_const (ctx:context) (prefix:string) (range:Sort.sort) = Z3native.mk_fresh_const ctx prefix range
532540
let mk_app (ctx:context) (f:FuncDecl.func_decl) (args:expr list) = expr_of_func_app ctx f args
533541
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
535543
let equal (a:expr) (b:expr) = AST.equal a b
536544
let compare (a:expr) (b:expr) = AST.compare a b
537545
end
@@ -1036,7 +1044,7 @@ struct
10361044
let mk_mod = Z3native.mk_mod
10371045
let mk_rem = Z3native.mk_rem
10381046
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)
10401048
let mk_int2real = Z3native.mk_int2real
10411049
let mk_int2bv = Z3native.mk_int2bv
10421050
end
@@ -1061,11 +1069,13 @@ struct
10611069
let mk_numeral_nd (ctx:context) (num:int) (den:int) =
10621070
if den = 0 then
10631071
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")
10641074
else
10651075
Z3native.mk_real ctx num den
10661076

10671077
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)
10691079
let mk_is_integer = Z3native.mk_is_int
10701080
let mk_real2int = Z3native.mk_real2int
10711081

@@ -1155,11 +1165,6 @@ struct
11551165
let is_bv_xor3 (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_XOR3)
11561166
let get_size (x:Sort.sort) = Z3native.get_bv_sort_size (Sort.gc x) x
11571167

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-
11631168
let numeral_to_string (x:expr) = Z3native.get_numeral_string (Expr.gc x) x
11641169
let mk_const (ctx:context) (name:Symbol.symbol) (size:int) =
11651170
Expr.mk_const ctx name (mk_sort ctx size)

Diff for: src/api/ml/z3.mli

-6
Original file line numberDiff line numberDiff line change
@@ -1152,9 +1152,6 @@ sig
11521152
(** Create a new integer sort. *)
11531153
val mk_sort : context -> Sort.sort
11541154

1155-
(** Retrieve the int value. *)
1156-
val get_int : Expr.expr -> int
1157-
11581155
(** Get a big_int from an integer numeral *)
11591156
val get_big_int : Expr.expr -> Big_int.big_int
11601157

@@ -1543,9 +1540,6 @@ sig
15431540
(** The size of a bit-vector sort. *)
15441541
val get_size : Sort.sort -> int
15451542

1546-
(** Retrieve the int value. *)
1547-
val get_int : Expr.expr -> int
1548-
15491543
(** Returns a string representation of a numeral. *)
15501544
val numeral_to_string : Expr.expr -> string
15511545

0 commit comments

Comments
 (0)