z3 0.0.20180203 → 0.0.20180616

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 82ddc6984f24ee79d2dcd7fba162818c0bce9959f6f7c4daad11305b09ac84b8
4
- data.tar.gz: 977d33cbd061672c85297e19dba7612c2f67bc0b5785ab1a67da828f17678b65
3
+ metadata.gz: e1a008f1afd884efa0e1dc6e9964e9f0be381bd77884a2526a07bff5efe64212
4
+ data.tar.gz: d9379bd2084cb2e5222856da043d58e8ddd399cd86abdce01f0243464e2c6097
5
5
  SHA512:
6
- metadata.gz: 49db1f83e829f4b982abb5aea5014f9b64f6e558ee945a3d4d451227004fbd562cc5cddda955b3148582bedc73e2d8e251bf1198f87454145fe22e889bb9eaba
7
- data.tar.gz: edcd476f98a22595b6a60a11606aec007b7852b7447904413c57388f3a8d6d06c5a058cc72d115f85ce61ebcb57d02c51c66535928b30a6f7de78f5a94ccc852
6
+ metadata.gz: 27b7f713bedcbe819207d9d120d081366a274d9f61c952625e7256d3c5f7d177ba6de6d55f31971c06e084fcefa80c52004cd271d7dc7163753daf61e156edcc
7
+ data.tar.gz: a6f97e4b4916e5189a94bc439bc174342dae679fec6a246ac1a4c6c4245d7355b619cf922515913e41f5d9070b719c0a562ca9682d4d37fcbe6b1d6959c0033b
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  This is Ruby interface for Z3 [ https://github.com/Z3Prover/z3 ].
2
2
 
3
+ Minimum required version is Z3 4.6.
4
+
3
5
  It's in very early stages of development. Pull requests always welcome.
4
6
 
5
7
  ### Interface
@@ -12,13 +14,16 @@ The interface is potentially unstable, and can change in the future.
12
14
 
13
15
  `Z3::VeryLowLever` and `Z3::LowLevel` are FFI interface for internal use, and they shouldn't be used directly. Also don't use any method starting with `_`. Doing this is likely to lead to segmentation faults unless extreme care is taken.
14
16
 
15
- ### Requirements
16
-
17
- To use it, you'll need to install `z3`. On OSX that would be:
17
+ A utility at `api/gen_api` will loop through a .h file and generate Ruby definitions. This will update the API when upstream changes `z3_api.h`
18
18
 
19
- brew install z3
19
+ ## Building
20
20
 
21
- On other systems use appropriate package manager.
21
+ ```
22
+ brew install z3
23
+ rake gem:build
24
+ bundle install
25
+ rake spec
26
+ ```
22
27
 
23
28
  *NB: On Linux, since FFI will look for `libz3.so`, you might need to install `libz3-dev`using your usual package manager.*
24
29
 
data/lib/z3.rb CHANGED
@@ -11,6 +11,7 @@ require_relative "z3/low_level_auto"
11
11
  require_relative "z3/ast"
12
12
  require_relative "z3/context"
13
13
  require_relative "z3/solver"
14
+ require_relative "z3/optimize"
14
15
  require_relative "z3/model"
15
16
  require_relative "z3/exception"
16
17
  require_relative "z3/func_decl"
@@ -34,7 +34,7 @@ module Z3
34
34
  BoolSort.new
35
35
  when Integer
36
36
  IntSort.new
37
- when Float
37
+ when Float, Rational
38
38
  RealSort.new
39
39
  else
40
40
  raise Z3::Exception, "No idea how to autoconvert `#{a.class}': `#{a.inspect}'"
@@ -89,8 +89,8 @@ module Z3
89
89
  FloatExpr.Min(self, other)
90
90
  end
91
91
 
92
- def exponent_string
93
- LowLevel.fpa_get_numeral_exponent_string(self)
92
+ def exponent_string(biased)
93
+ LowLevel.fpa_get_numeral_exponent_string(self, biased)
94
94
  end
95
95
 
96
96
  def significand_string
@@ -169,12 +169,12 @@ module Z3
169
169
  a.sort.new(LowLevel.mk_fpa_rem(a, b))
170
170
  end
171
171
 
172
- # Weirdly this dies when trying to calll Z3_get_ast_kind, while min works on same call
173
- #
174
- # def Max(a, b)
175
- # a, b = coerce_to_same_float_sort(a, b)
176
- # a.sort.new(LowLevel.mk_fpa_max(a, b))
177
- # end
172
+ # In older versons, this dies when trying to calll Z3_get_ast_kind, min works on same call
173
+ # Works in 4.6
174
+ def Max(a, b)
175
+ a, b = coerce_to_same_float_sort(a, b)
176
+ a.sort.new(LowLevel.mk_fpa_max(a, b))
177
+ end
178
178
 
179
179
  def Min(a, b)
180
180
  a, b = coerce_to_same_float_sort(a, b)
@@ -1,6 +1,14 @@
1
1
  module Z3
2
2
  module LowLevel
3
3
  class << self
4
+ def add_const_interp(model, func_decl, ast) #=> :void
5
+ VeryLowLevel.Z3_add_const_interp(_ctx_pointer, model._model, func_decl._ast, ast._ast)
6
+ end
7
+
8
+ def add_func_interp(model, func_decl, ast) #=> :func_interp_pointer
9
+ VeryLowLevel.Z3_add_func_interp(_ctx_pointer, model._model, func_decl._ast, ast._ast)
10
+ end
11
+
4
12
  def algebraic_add(ast1, ast2) #=> :ast_pointer
5
13
  VeryLowLevel.Z3_algebraic_add(_ctx_pointer, ast1._ast, ast2._ast)
6
14
  end
@@ -213,6 +221,10 @@ module Z3
213
221
  VeryLowLevel.Z3_fixedpoint_add_cover(_ctx_pointer, fixedpoint._fixedpoint, num, func_decl._ast, ast._ast)
214
222
  end
215
223
 
224
+ def fixedpoint_add_invariant(fixedpoint, func_decl, ast) #=> :void
225
+ VeryLowLevel.Z3_fixedpoint_add_invariant(_ctx_pointer, fixedpoint._fixedpoint, func_decl._ast, ast._ast)
226
+ end
227
+
216
228
  def fixedpoint_add_rule(fixedpoint, ast, sym) #=> :void
217
229
  VeryLowLevel.Z3_fixedpoint_add_rule(_ctx_pointer, fixedpoint._fixedpoint, ast._ast, sym)
218
230
  end
@@ -245,6 +257,10 @@ module Z3
245
257
  VeryLowLevel.Z3_fixedpoint_get_cover_delta(_ctx_pointer, fixedpoint._fixedpoint, num, func_decl._ast)
246
258
  end
247
259
 
260
+ def fixedpoint_get_ground_sat_answer(fixedpoint) #=> :ast_pointer
261
+ VeryLowLevel.Z3_fixedpoint_get_ground_sat_answer(_ctx_pointer, fixedpoint._fixedpoint)
262
+ end
263
+
248
264
  def fixedpoint_get_help(fixedpoint) #=> :string
249
265
  VeryLowLevel.Z3_fixedpoint_get_help(_ctx_pointer, fixedpoint._fixedpoint)
250
266
  end
@@ -257,14 +273,26 @@ module Z3
257
273
  VeryLowLevel.Z3_fixedpoint_get_param_descrs(_ctx_pointer, fixedpoint._fixedpoint)
258
274
  end
259
275
 
276
+ def fixedpoint_get_reachable(fixedpoint, func_decl) #=> :ast_pointer
277
+ VeryLowLevel.Z3_fixedpoint_get_reachable(_ctx_pointer, fixedpoint._fixedpoint, func_decl._ast)
278
+ end
279
+
260
280
  def fixedpoint_get_reason_unknown(fixedpoint) #=> :string
261
281
  VeryLowLevel.Z3_fixedpoint_get_reason_unknown(_ctx_pointer, fixedpoint._fixedpoint)
262
282
  end
263
283
 
284
+ def fixedpoint_get_rule_names_along_trace(fixedpoint) #=> :symbol_pointer
285
+ VeryLowLevel.Z3_fixedpoint_get_rule_names_along_trace(_ctx_pointer, fixedpoint._fixedpoint)
286
+ end
287
+
264
288
  def fixedpoint_get_rules(fixedpoint) #=> :ast_vector_pointer
265
289
  VeryLowLevel.Z3_fixedpoint_get_rules(_ctx_pointer, fixedpoint._fixedpoint)
266
290
  end
267
291
 
292
+ def fixedpoint_get_rules_along_trace(fixedpoint) #=> :ast_vector_pointer
293
+ VeryLowLevel.Z3_fixedpoint_get_rules_along_trace(_ctx_pointer, fixedpoint._fixedpoint)
294
+ end
295
+
268
296
  def fixedpoint_get_statistics(fixedpoint) #=> :stats_pointer
269
297
  VeryLowLevel.Z3_fixedpoint_get_statistics(_ctx_pointer, fixedpoint._fixedpoint)
270
298
  end
@@ -285,6 +313,10 @@ module Z3
285
313
  VeryLowLevel.Z3_fixedpoint_query(_ctx_pointer, fixedpoint._fixedpoint, ast._ast)
286
314
  end
287
315
 
316
+ def fixedpoint_query_from_lvl(fixedpoint, ast, num) #=> :int
317
+ VeryLowLevel.Z3_fixedpoint_query_from_lvl(_ctx_pointer, fixedpoint._fixedpoint, ast._ast, num)
318
+ end
319
+
288
320
  def fixedpoint_register_relation(fixedpoint, func_decl) #=> :void
289
321
  VeryLowLevel.Z3_fixedpoint_register_relation(_ctx_pointer, fixedpoint._fixedpoint, func_decl._ast)
290
322
  end
@@ -301,8 +333,20 @@ module Z3
301
333
  VeryLowLevel.Z3_fpa_get_ebits(_ctx_pointer, sort._ast)
302
334
  end
303
335
 
304
- def fpa_get_numeral_exponent_string(ast) #=> :string
305
- VeryLowLevel.Z3_fpa_get_numeral_exponent_string(_ctx_pointer, ast._ast)
336
+ def fpa_get_numeral_exponent_bv(ast, bool) #=> :ast_pointer
337
+ VeryLowLevel.Z3_fpa_get_numeral_exponent_bv(_ctx_pointer, ast._ast, bool)
338
+ end
339
+
340
+ def fpa_get_numeral_exponent_string(ast, bool) #=> :string
341
+ VeryLowLevel.Z3_fpa_get_numeral_exponent_string(_ctx_pointer, ast._ast, bool)
342
+ end
343
+
344
+ def fpa_get_numeral_sign_bv(ast) #=> :ast_pointer
345
+ VeryLowLevel.Z3_fpa_get_numeral_sign_bv(_ctx_pointer, ast._ast)
346
+ end
347
+
348
+ def fpa_get_numeral_significand_bv(ast) #=> :ast_pointer
349
+ VeryLowLevel.Z3_fpa_get_numeral_significand_bv(_ctx_pointer, ast._ast)
306
350
  end
307
351
 
308
352
  def fpa_get_numeral_significand_string(ast) #=> :string
@@ -313,6 +357,34 @@ module Z3
313
357
  VeryLowLevel.Z3_fpa_get_sbits(_ctx_pointer, sort._ast)
314
358
  end
315
359
 
360
+ def fpa_is_numeral_inf(ast) #=> :bool
361
+ VeryLowLevel.Z3_fpa_is_numeral_inf(_ctx_pointer, ast._ast)
362
+ end
363
+
364
+ def fpa_is_numeral_nan(ast) #=> :bool
365
+ VeryLowLevel.Z3_fpa_is_numeral_nan(_ctx_pointer, ast._ast)
366
+ end
367
+
368
+ def fpa_is_numeral_negative(ast) #=> :bool
369
+ VeryLowLevel.Z3_fpa_is_numeral_negative(_ctx_pointer, ast._ast)
370
+ end
371
+
372
+ def fpa_is_numeral_normal(ast) #=> :bool
373
+ VeryLowLevel.Z3_fpa_is_numeral_normal(_ctx_pointer, ast._ast)
374
+ end
375
+
376
+ def fpa_is_numeral_positive(ast) #=> :bool
377
+ VeryLowLevel.Z3_fpa_is_numeral_positive(_ctx_pointer, ast._ast)
378
+ end
379
+
380
+ def fpa_is_numeral_subnormal(ast) #=> :bool
381
+ VeryLowLevel.Z3_fpa_is_numeral_subnormal(_ctx_pointer, ast._ast)
382
+ end
383
+
384
+ def fpa_is_numeral_zero(ast) #=> :bool
385
+ VeryLowLevel.Z3_fpa_is_numeral_zero(_ctx_pointer, ast._ast)
386
+ end
387
+
316
388
  def func_entry_dec_ref(func_entry) #=> :void
317
389
  VeryLowLevel.Z3_func_entry_dec_ref(_ctx_pointer, func_entry._func_entry)
318
390
  end
@@ -333,6 +405,10 @@ module Z3
333
405
  VeryLowLevel.Z3_func_entry_inc_ref(_ctx_pointer, func_entry._func_entry)
334
406
  end
335
407
 
408
+ def func_interp_add_entry(func_interp, ast_vector, ast) #=> :void
409
+ VeryLowLevel.Z3_func_interp_add_entry(_ctx_pointer, func_interp._func_interp, ast_vector, ast._ast)
410
+ end
411
+
336
412
  def func_interp_dec_ref(func_interp) #=> :void
337
413
  VeryLowLevel.Z3_func_interp_dec_ref(_ctx_pointer, func_interp._func_interp)
338
414
  end
@@ -357,6 +433,10 @@ module Z3
357
433
  VeryLowLevel.Z3_func_interp_inc_ref(_ctx_pointer, func_interp._func_interp)
358
434
  end
359
435
 
436
+ def func_interp_set_else(func_interp, ast) #=> :void
437
+ VeryLowLevel.Z3_func_interp_set_else(_ctx_pointer, func_interp._func_interp, ast._ast)
438
+ end
439
+
360
440
  def get_algebraic_number_lower(ast, num) #=> :ast_pointer
361
441
  VeryLowLevel.Z3_get_algebraic_number_lower(_ctx_pointer, ast._ast, num)
362
442
  end
@@ -489,6 +569,10 @@ module Z3
489
569
  VeryLowLevel.Z3_get_error_code(_ctx_pointer)
490
570
  end
491
571
 
572
+ def get_full_version #=> :string
573
+ VeryLowLevel.Z3_get_full_version()
574
+ end
575
+
492
576
  def get_func_decl_id(func_decl) #=> :uint
493
577
  VeryLowLevel.Z3_get_func_decl_id(_ctx_pointer, func_decl._ast)
494
578
  end
@@ -521,6 +605,10 @@ module Z3
521
605
  VeryLowLevel.Z3_get_numerator(_ctx_pointer, ast._ast)
522
606
  end
523
607
 
608
+ def get_parser_error #=> :string
609
+ VeryLowLevel.Z3_get_parser_error(_ctx_pointer)
610
+ end
611
+
524
612
  def get_pattern(pattern, num) #=> :ast_pointer
525
613
  VeryLowLevel.Z3_get_pattern(_ctx_pointer, pattern._ast, num)
526
614
  end
@@ -745,6 +833,10 @@ module Z3
745
833
  VeryLowLevel.Z3_mk_array_sort(_ctx_pointer, sort1._ast, sort2._ast)
746
834
  end
747
835
 
836
+ def mk_as_array(func_decl) #=> :ast_pointer
837
+ VeryLowLevel.Z3_mk_as_array(_ctx_pointer, func_decl._ast)
838
+ end
839
+
748
840
  def mk_ast_map #=> :ast_map_pointer
749
841
  VeryLowLevel.Z3_mk_ast_map(_ctx_pointer)
750
842
  end
@@ -1253,6 +1345,10 @@ module Z3
1253
1345
  VeryLowLevel.Z3_mk_int_symbol(_ctx_pointer, num)
1254
1346
  end
1255
1347
 
1348
+ def mk_int_to_str(ast) #=> :ast_pointer
1349
+ VeryLowLevel.Z3_mk_int_to_str(_ctx_pointer, ast._ast)
1350
+ end
1351
+
1256
1352
  def mk_interpolant(ast) #=> :ast_pointer
1257
1353
  VeryLowLevel.Z3_mk_interpolant(_ctx_pointer, ast._ast)
1258
1354
  end
@@ -1281,6 +1377,10 @@ module Z3
1281
1377
  VeryLowLevel.Z3_mk_mod(_ctx_pointer, ast1._ast, ast2._ast)
1282
1378
  end
1283
1379
 
1380
+ def mk_model #=> :model_pointer
1381
+ VeryLowLevel.Z3_mk_model(_ctx_pointer)
1382
+ end
1383
+
1284
1384
  def mk_not(ast) #=> :ast_pointer
1285
1385
  VeryLowLevel.Z3_mk_not(_ctx_pointer, ast._ast)
1286
1386
  end
@@ -1305,6 +1405,26 @@ module Z3
1305
1405
  VeryLowLevel.Z3_mk_probe(_ctx_pointer, str)
1306
1406
  end
1307
1407
 
1408
+ def mk_re_complement(ast) #=> :ast_pointer
1409
+ VeryLowLevel.Z3_mk_re_complement(_ctx_pointer, ast._ast)
1410
+ end
1411
+
1412
+ def mk_re_empty(sort) #=> :ast_pointer
1413
+ VeryLowLevel.Z3_mk_re_empty(_ctx_pointer, sort._ast)
1414
+ end
1415
+
1416
+ def mk_re_full(sort) #=> :ast_pointer
1417
+ VeryLowLevel.Z3_mk_re_full(_ctx_pointer, sort._ast)
1418
+ end
1419
+
1420
+ def mk_re_loop(ast, num1, num2) #=> :ast_pointer
1421
+ VeryLowLevel.Z3_mk_re_loop(_ctx_pointer, ast._ast, num1, num2)
1422
+ end
1423
+
1424
+ def mk_re_range(ast1, ast2) #=> :ast_pointer
1425
+ VeryLowLevel.Z3_mk_re_range(_ctx_pointer, ast1._ast, ast2._ast)
1426
+ end
1427
+
1308
1428
  def mk_real(num1, num2) #=> :ast_pointer
1309
1429
  VeryLowLevel.Z3_mk_real(_ctx_pointer, num1, num2)
1310
1430
  end
@@ -1389,6 +1509,10 @@ module Z3
1389
1509
  VeryLowLevel.Z3_mk_store(_ctx_pointer, ast1._ast, ast2._ast, ast3._ast)
1390
1510
  end
1391
1511
 
1512
+ def mk_str_to_int(ast) #=> :ast_pointer
1513
+ VeryLowLevel.Z3_mk_str_to_int(_ctx_pointer, ast._ast)
1514
+ end
1515
+
1392
1516
  def mk_string_symbol(str) #=> :symbol_pointer
1393
1517
  VeryLowLevel.Z3_mk_string_symbol(_ctx_pointer, str)
1394
1518
  end
@@ -1429,6 +1553,10 @@ module Z3
1429
1553
  VeryLowLevel.Z3_model_dec_ref(_ctx_pointer, model._model)
1430
1554
  end
1431
1555
 
1556
+ def model_extrapolate(model, ast) #=> :ast_pointer
1557
+ VeryLowLevel.Z3_model_extrapolate(_ctx_pointer, model._model, ast._ast)
1558
+ end
1559
+
1432
1560
  def model_get_const_decl(model, num) #=> :func_decl_pointer
1433
1561
  VeryLowLevel.Z3_model_get_const_decl(_ctx_pointer, model._model, num)
1434
1562
  end
@@ -1493,6 +1621,18 @@ module Z3
1493
1621
  VeryLowLevel.Z3_optimize_dec_ref(_ctx_pointer, optimize._optimize)
1494
1622
  end
1495
1623
 
1624
+ def optimize_from_file(optimize, str) #=> :void
1625
+ VeryLowLevel.Z3_optimize_from_file(_ctx_pointer, optimize._optimize, str)
1626
+ end
1627
+
1628
+ def optimize_from_string(optimize, str) #=> :void
1629
+ VeryLowLevel.Z3_optimize_from_string(_ctx_pointer, optimize._optimize, str)
1630
+ end
1631
+
1632
+ def optimize_get_assertions(optimize) #=> :ast_vector_pointer
1633
+ VeryLowLevel.Z3_optimize_get_assertions(_ctx_pointer, optimize._optimize)
1634
+ end
1635
+
1496
1636
  def optimize_get_help(optimize) #=> :string
1497
1637
  VeryLowLevel.Z3_optimize_get_help(_ctx_pointer, optimize._optimize)
1498
1638
  end
@@ -1501,10 +1641,18 @@ module Z3
1501
1641
  VeryLowLevel.Z3_optimize_get_lower(_ctx_pointer, optimize._optimize, num)
1502
1642
  end
1503
1643
 
1644
+ def optimize_get_lower_as_vector(optimize, num) #=> :ast_vector_pointer
1645
+ VeryLowLevel.Z3_optimize_get_lower_as_vector(_ctx_pointer, optimize._optimize, num)
1646
+ end
1647
+
1504
1648
  def optimize_get_model(optimize) #=> :model_pointer
1505
1649
  VeryLowLevel.Z3_optimize_get_model(_ctx_pointer, optimize._optimize)
1506
1650
  end
1507
1651
 
1652
+ def optimize_get_objectives(optimize) #=> :ast_vector_pointer
1653
+ VeryLowLevel.Z3_optimize_get_objectives(_ctx_pointer, optimize._optimize)
1654
+ end
1655
+
1508
1656
  def optimize_get_param_descrs(optimize) #=> :param_descrs_pointer
1509
1657
  VeryLowLevel.Z3_optimize_get_param_descrs(_ctx_pointer, optimize._optimize)
1510
1658
  end
@@ -1521,6 +1669,10 @@ module Z3
1521
1669
  VeryLowLevel.Z3_optimize_get_upper(_ctx_pointer, optimize._optimize, num)
1522
1670
  end
1523
1671
 
1672
+ def optimize_get_upper_as_vector(optimize, num) #=> :ast_vector_pointer
1673
+ VeryLowLevel.Z3_optimize_get_upper_as_vector(_ctx_pointer, optimize._optimize, num)
1674
+ end
1675
+
1524
1676
  def optimize_inc_ref(optimize) #=> :void
1525
1677
  VeryLowLevel.Z3_optimize_inc_ref(_ctx_pointer, optimize._optimize)
1526
1678
  end
@@ -1665,6 +1817,10 @@ module Z3
1665
1817
  VeryLowLevel.Z3_probe_or(_ctx_pointer, probe1._probe, probe2._probe)
1666
1818
  end
1667
1819
 
1820
+ def qe_lite(ast_vector, ast) #=> :ast_pointer
1821
+ VeryLowLevel.Z3_qe_lite(_ctx_pointer, ast_vector, ast._ast)
1822
+ end
1823
+
1668
1824
  def rcf_add(num1, num2) #=> :rcf_num_pointer
1669
1825
  VeryLowLevel.Z3_rcf_add(_ctx_pointer, num1._rcf_num, num2._rcf_num)
1670
1826
  end
@@ -1789,10 +1945,22 @@ module Z3
1789
1945
  VeryLowLevel.Z3_solver_dec_ref(_ctx_pointer, solver._solver)
1790
1946
  end
1791
1947
 
1948
+ def solver_from_file(solver, str) #=> :void
1949
+ VeryLowLevel.Z3_solver_from_file(_ctx_pointer, solver._solver, str)
1950
+ end
1951
+
1952
+ def solver_from_string(solver, str) #=> :void
1953
+ VeryLowLevel.Z3_solver_from_string(_ctx_pointer, solver._solver, str)
1954
+ end
1955
+
1792
1956
  def solver_get_assertions(solver) #=> :ast_vector_pointer
1793
1957
  VeryLowLevel.Z3_solver_get_assertions(_ctx_pointer, solver._solver)
1794
1958
  end
1795
1959
 
1960
+ def solver_get_consequences(solver, ast_vector1, ast_vector2, ast_vector3) #=> :int
1961
+ VeryLowLevel.Z3_solver_get_consequences(_ctx_pointer, solver._solver, ast_vector1, ast_vector2, ast_vector3)
1962
+ end
1963
+
1796
1964
  def solver_get_help(solver) #=> :string
1797
1965
  VeryLowLevel.Z3_solver_get_help(_ctx_pointer, solver._solver)
1798
1966
  end
@@ -0,0 +1,126 @@
1
+ module Z3
2
+ class Optimize
3
+ attr_reader :_optimize
4
+ def initialize
5
+ @_optimize = LowLevel.mk_optimize
6
+ LowLevel.optimize_inc_ref(self)
7
+ reset_model!
8
+ end
9
+
10
+ def push
11
+ reset_model!
12
+ LowLevel.optimize_push(self)
13
+ end
14
+
15
+ def pop
16
+ reset_model!
17
+ LowLevel.optimize_pop(self)
18
+ end
19
+
20
+ def assert(ast)
21
+ reset_model!
22
+ LowLevel.optimize_assert(self, ast)
23
+ end
24
+
25
+ def assert_soft(ast)
26
+ reset_model!
27
+ LowLevel.optimize_assert_soft(self, ast)
28
+ end
29
+
30
+ def check
31
+ reset_model!
32
+ result = check_sat_results(LowLevel.optimize_check(self))
33
+ @has_model = true if result == :sat
34
+ result
35
+ end
36
+
37
+ def satisfiable?
38
+ case check
39
+ when :sat
40
+ true
41
+ when :unsat
42
+ false
43
+ else
44
+ raise Z3::Exception, "Satisfiability unknown"
45
+ end
46
+ end
47
+
48
+ def unsatisfiable?
49
+ case check
50
+ when :unsat
51
+ true
52
+ when :sat
53
+ false
54
+ else
55
+ raise Z3::Exception, "Satisfiability unknown"
56
+ end
57
+ end
58
+
59
+ def model
60
+ if @has_model
61
+ @model ||= Z3::Model.new(LowLevel.optimize_get_model(self))
62
+ else
63
+ raise Z3::Exception, "You need to check that it's satisfiable before asking for the model"
64
+ end
65
+ end
66
+
67
+ def assertions
68
+ _ast_vector = LowLevel.optimize_get_assertions(self)
69
+ LowLevel.unpack_ast_vector(_ast_vector)
70
+ end
71
+
72
+ def statistics
73
+ _stats = LowLevel::optimize_get_statistics(self)
74
+ LowLevel.unpack_statistics(_stats)
75
+ end
76
+
77
+ def prove!(ast)
78
+ @has_model = false
79
+ push
80
+ assert(~ast)
81
+ case check
82
+ when :sat
83
+ puts "Counterexample exists"
84
+ model.each do |n,v|
85
+ puts "* #{n} = #{v}"
86
+ end
87
+ when :unknown
88
+ puts "Unknown"
89
+ when :unsat
90
+ puts "Proven"
91
+ else
92
+ raise "Wrong SAT result #{r}"
93
+ end
94
+ ensure
95
+ pop
96
+ end
97
+
98
+
99
+ def reason_unknown
100
+ LowLevel.optimize_get_reason_unknown(self)
101
+ end
102
+
103
+ def maximize(ast)
104
+ LowLevel.optimize_maximize(self, ast)
105
+ end
106
+
107
+ def minimize(ast)
108
+ LowLevel.optimize_minimize(self, ast)
109
+ end
110
+
111
+ private
112
+
113
+ def reset_model!
114
+ @has_model = false
115
+ @model = nil
116
+ end
117
+
118
+ def check_sat_results(r)
119
+ {
120
+ -1 => :unsat,
121
+ 0 => :unknown,
122
+ 1 => :sat,
123
+ }[r] or raise Z3::Exception, "Wrong SAT result #{r}"
124
+ end
125
+ end
126
+ end
@@ -44,9 +44,9 @@ module Z3
44
44
  decl = FuncDecl.new( LowLevel::get_as_array_func_decl(a) )
45
45
  PrintedExpr.new(decl.sexpr.gsub(/k!\d+/, "k!"))
46
46
  elsif a.func_decl.name == "fp.numeral" and a.sort.is_a?(FloatSort)
47
+ # This API chaged in Z3 4.6
47
48
  s = a.significand_string
48
- e = a.exponent_string
49
- e = "+#{e}" if e[0] != "-"
49
+ e = "%+d" % a.exponent_string(false).to_i
50
50
  PrintedExpr.new("#{s}B#{e}")
51
51
  else
52
52
  decl = a.func_decl
@@ -9,7 +9,7 @@ module Z3
9
9
  end
10
10
 
11
11
  def from_const(val)
12
- if val.is_a?(Integer) or (val.is_a?(Float) and val.finite?)
12
+ if val.is_a?(Integer) or (val.is_a?(Float) and val.finite?) or val.is_a?(Rational)
13
13
  new LowLevel.mk_numeral(val.to_s, self)
14
14
  else
15
15
  raise Z3::Exception, "Cannot convert #{val.class} to #{self.class}"
@@ -1,5 +1,7 @@
1
1
  module Z3
2
2
  module VeryLowLevel
3
+ attach_function :Z3_add_const_interp, [:ctx_pointer, :model_pointer, :func_decl_pointer, :ast_pointer], :void
4
+ attach_function :Z3_add_func_interp, [:ctx_pointer, :model_pointer, :func_decl_pointer, :ast_pointer], :func_interp_pointer
3
5
  attach_function :Z3_algebraic_add, [:ctx_pointer, :ast_pointer, :ast_pointer], :ast_pointer
4
6
  attach_function :Z3_algebraic_div, [:ctx_pointer, :ast_pointer, :ast_pointer], :ast_pointer
5
7
  attach_function :Z3_algebraic_eq, [:ctx_pointer, :ast_pointer, :ast_pointer], :bool
@@ -53,6 +55,7 @@ module Z3
53
55
  attach_function :Z3_enable_trace, [:string], :void
54
56
  attach_function :Z3_finalize_memory, [], :void
55
57
  attach_function :Z3_fixedpoint_add_cover, [:ctx_pointer, :fixedpoint_pointer, :int, :func_decl_pointer, :ast_pointer], :void
58
+ attach_function :Z3_fixedpoint_add_invariant, [:ctx_pointer, :fixedpoint_pointer, :func_decl_pointer, :ast_pointer], :void
56
59
  attach_function :Z3_fixedpoint_add_rule, [:ctx_pointer, :fixedpoint_pointer, :ast_pointer, :symbol_pointer], :void
57
60
  attach_function :Z3_fixedpoint_assert, [:ctx_pointer, :fixedpoint_pointer, :ast_pointer], :void
58
61
  attach_function :Z3_fixedpoint_dec_ref, [:ctx_pointer, :fixedpoint_pointer], :void
@@ -61,34 +64,51 @@ module Z3
61
64
  attach_function :Z3_fixedpoint_get_answer, [:ctx_pointer, :fixedpoint_pointer], :ast_pointer
62
65
  attach_function :Z3_fixedpoint_get_assertions, [:ctx_pointer, :fixedpoint_pointer], :ast_vector_pointer
63
66
  attach_function :Z3_fixedpoint_get_cover_delta, [:ctx_pointer, :fixedpoint_pointer, :int, :func_decl_pointer], :ast_pointer
67
+ attach_function :Z3_fixedpoint_get_ground_sat_answer, [:ctx_pointer, :fixedpoint_pointer], :ast_pointer
64
68
  attach_function :Z3_fixedpoint_get_help, [:ctx_pointer, :fixedpoint_pointer], :string
65
69
  attach_function :Z3_fixedpoint_get_num_levels, [:ctx_pointer, :fixedpoint_pointer, :func_decl_pointer], :uint
66
70
  attach_function :Z3_fixedpoint_get_param_descrs, [:ctx_pointer, :fixedpoint_pointer], :param_descrs_pointer
71
+ attach_function :Z3_fixedpoint_get_reachable, [:ctx_pointer, :fixedpoint_pointer, :func_decl_pointer], :ast_pointer
67
72
  attach_function :Z3_fixedpoint_get_reason_unknown, [:ctx_pointer, :fixedpoint_pointer], :string
73
+ attach_function :Z3_fixedpoint_get_rule_names_along_trace, [:ctx_pointer, :fixedpoint_pointer], :symbol_pointer
68
74
  attach_function :Z3_fixedpoint_get_rules, [:ctx_pointer, :fixedpoint_pointer], :ast_vector_pointer
75
+ attach_function :Z3_fixedpoint_get_rules_along_trace, [:ctx_pointer, :fixedpoint_pointer], :ast_vector_pointer
69
76
  attach_function :Z3_fixedpoint_get_statistics, [:ctx_pointer, :fixedpoint_pointer], :stats_pointer
70
77
  attach_function :Z3_fixedpoint_inc_ref, [:ctx_pointer, :fixedpoint_pointer], :void
71
78
  attach_function :Z3_fixedpoint_pop, [:ctx_pointer, :fixedpoint_pointer], :void
72
79
  attach_function :Z3_fixedpoint_push, [:ctx_pointer, :fixedpoint_pointer], :void
73
80
  attach_function :Z3_fixedpoint_query, [:ctx_pointer, :fixedpoint_pointer, :ast_pointer], :int
81
+ attach_function :Z3_fixedpoint_query_from_lvl, [:ctx_pointer, :fixedpoint_pointer, :ast_pointer, :uint], :int
74
82
  attach_function :Z3_fixedpoint_register_relation, [:ctx_pointer, :fixedpoint_pointer, :func_decl_pointer], :void
75
83
  attach_function :Z3_fixedpoint_set_params, [:ctx_pointer, :fixedpoint_pointer, :params_pointer], :void
76
84
  attach_function :Z3_fixedpoint_update_rule, [:ctx_pointer, :fixedpoint_pointer, :ast_pointer, :symbol_pointer], :void
77
85
  attach_function :Z3_fpa_get_ebits, [:ctx_pointer, :sort_pointer], :uint
78
- attach_function :Z3_fpa_get_numeral_exponent_string, [:ctx_pointer, :ast_pointer], :string
86
+ attach_function :Z3_fpa_get_numeral_exponent_bv, [:ctx_pointer, :ast_pointer, :bool], :ast_pointer
87
+ attach_function :Z3_fpa_get_numeral_exponent_string, [:ctx_pointer, :ast_pointer, :bool], :string
88
+ attach_function :Z3_fpa_get_numeral_sign_bv, [:ctx_pointer, :ast_pointer], :ast_pointer
89
+ attach_function :Z3_fpa_get_numeral_significand_bv, [:ctx_pointer, :ast_pointer], :ast_pointer
79
90
  attach_function :Z3_fpa_get_numeral_significand_string, [:ctx_pointer, :ast_pointer], :string
80
91
  attach_function :Z3_fpa_get_sbits, [:ctx_pointer, :sort_pointer], :uint
92
+ attach_function :Z3_fpa_is_numeral_inf, [:ctx_pointer, :ast_pointer], :bool
93
+ attach_function :Z3_fpa_is_numeral_nan, [:ctx_pointer, :ast_pointer], :bool
94
+ attach_function :Z3_fpa_is_numeral_negative, [:ctx_pointer, :ast_pointer], :bool
95
+ attach_function :Z3_fpa_is_numeral_normal, [:ctx_pointer, :ast_pointer], :bool
96
+ attach_function :Z3_fpa_is_numeral_positive, [:ctx_pointer, :ast_pointer], :bool
97
+ attach_function :Z3_fpa_is_numeral_subnormal, [:ctx_pointer, :ast_pointer], :bool
98
+ attach_function :Z3_fpa_is_numeral_zero, [:ctx_pointer, :ast_pointer], :bool
81
99
  attach_function :Z3_func_entry_dec_ref, [:ctx_pointer, :func_entry_pointer], :void
82
100
  attach_function :Z3_func_entry_get_arg, [:ctx_pointer, :func_entry_pointer, :uint], :ast_pointer
83
101
  attach_function :Z3_func_entry_get_num_args, [:ctx_pointer, :func_entry_pointer], :uint
84
102
  attach_function :Z3_func_entry_get_value, [:ctx_pointer, :func_entry_pointer], :ast_pointer
85
103
  attach_function :Z3_func_entry_inc_ref, [:ctx_pointer, :func_entry_pointer], :void
104
+ attach_function :Z3_func_interp_add_entry, [:ctx_pointer, :func_interp_pointer, :ast_vector_pointer, :ast_pointer], :void
86
105
  attach_function :Z3_func_interp_dec_ref, [:ctx_pointer, :func_interp_pointer], :void
87
106
  attach_function :Z3_func_interp_get_arity, [:ctx_pointer, :func_interp_pointer], :uint
88
107
  attach_function :Z3_func_interp_get_else, [:ctx_pointer, :func_interp_pointer], :ast_pointer
89
108
  attach_function :Z3_func_interp_get_entry, [:ctx_pointer, :func_interp_pointer, :uint], :func_entry_pointer
90
109
  attach_function :Z3_func_interp_get_num_entries, [:ctx_pointer, :func_interp_pointer], :uint
91
110
  attach_function :Z3_func_interp_inc_ref, [:ctx_pointer, :func_interp_pointer], :void
111
+ attach_function :Z3_func_interp_set_else, [:ctx_pointer, :func_interp_pointer, :ast_pointer], :void
92
112
  attach_function :Z3_get_algebraic_number_lower, [:ctx_pointer, :ast_pointer, :uint], :ast_pointer
93
113
  attach_function :Z3_get_algebraic_number_upper, [:ctx_pointer, :ast_pointer, :uint], :ast_pointer
94
114
  attach_function :Z3_get_app_arg, [:ctx_pointer, :app_pointer, :uint], :ast_pointer
@@ -122,6 +142,7 @@ module Z3
122
142
  attach_function :Z3_get_domain, [:ctx_pointer, :func_decl_pointer, :uint], :sort_pointer
123
143
  attach_function :Z3_get_domain_size, [:ctx_pointer, :func_decl_pointer], :uint
124
144
  attach_function :Z3_get_error_code, [:ctx_pointer], :uint
145
+ attach_function :Z3_get_full_version, [], :string
125
146
  attach_function :Z3_get_func_decl_id, [:ctx_pointer, :func_decl_pointer], :uint
126
147
  attach_function :Z3_get_index_value, [:ctx_pointer, :ast_pointer], :uint
127
148
  attach_function :Z3_get_interpolant, [:ctx_pointer, :ast_pointer, :ast_pointer, :params_pointer], :ast_vector_pointer
@@ -130,6 +151,7 @@ module Z3
130
151
  attach_function :Z3_get_numeral_decimal_string, [:ctx_pointer, :ast_pointer, :uint], :string
131
152
  attach_function :Z3_get_numeral_string, [:ctx_pointer, :ast_pointer], :string
132
153
  attach_function :Z3_get_numerator, [:ctx_pointer, :ast_pointer], :ast_pointer
154
+ attach_function :Z3_get_parser_error, [:ctx_pointer], :string
133
155
  attach_function :Z3_get_pattern, [:ctx_pointer, :pattern_pointer, :uint], :ast_pointer
134
156
  attach_function :Z3_get_pattern_num_terms, [:ctx_pointer, :pattern_pointer], :uint
135
157
  attach_function :Z3_get_probe_name, [:ctx_pointer, :uint], :string
@@ -186,6 +208,7 @@ module Z3
186
208
  attach_function :Z3_is_well_sorted, [:ctx_pointer, :ast_pointer], :bool
187
209
  attach_function :Z3_mk_array_default, [:ctx_pointer, :ast_pointer], :ast_pointer
188
210
  attach_function :Z3_mk_array_sort, [:ctx_pointer, :sort_pointer, :sort_pointer], :sort_pointer
211
+ attach_function :Z3_mk_as_array, [:ctx_pointer, :func_decl_pointer], :ast_pointer
189
212
  attach_function :Z3_mk_ast_map, [:ctx_pointer], :ast_map_pointer
190
213
  attach_function :Z3_mk_ast_vector, [:ctx_pointer], :ast_vector_pointer
191
214
  attach_function :Z3_mk_bool_sort, [:ctx_pointer], :sort_pointer
@@ -313,6 +336,7 @@ module Z3
313
336
  attach_function :Z3_mk_int64, [:ctx_pointer, :int64, :sort_pointer], :ast_pointer
314
337
  attach_function :Z3_mk_int_sort, [:ctx_pointer], :sort_pointer
315
338
  attach_function :Z3_mk_int_symbol, [:ctx_pointer, :int], :symbol_pointer
339
+ attach_function :Z3_mk_int_to_str, [:ctx_pointer, :ast_pointer], :ast_pointer
316
340
  attach_function :Z3_mk_interpolant, [:ctx_pointer, :ast_pointer], :ast_pointer
317
341
  attach_function :Z3_mk_interpolation_context, [:config_pointer], :ctx_pointer
318
342
  attach_function :Z3_mk_is_int, [:ctx_pointer, :ast_pointer], :ast_pointer
@@ -320,12 +344,18 @@ module Z3
320
344
  attach_function :Z3_mk_le, [:ctx_pointer, :ast_pointer, :ast_pointer], :ast_pointer
321
345
  attach_function :Z3_mk_lt, [:ctx_pointer, :ast_pointer, :ast_pointer], :ast_pointer
322
346
  attach_function :Z3_mk_mod, [:ctx_pointer, :ast_pointer, :ast_pointer], :ast_pointer
347
+ attach_function :Z3_mk_model, [:ctx_pointer], :model_pointer
323
348
  attach_function :Z3_mk_not, [:ctx_pointer, :ast_pointer], :ast_pointer
324
349
  attach_function :Z3_mk_numeral, [:ctx_pointer, :string, :sort_pointer], :ast_pointer
325
350
  attach_function :Z3_mk_optimize, [:ctx_pointer], :optimize_pointer
326
351
  attach_function :Z3_mk_params, [:ctx_pointer], :params_pointer
327
352
  attach_function :Z3_mk_power, [:ctx_pointer, :ast_pointer, :ast_pointer], :ast_pointer
328
353
  attach_function :Z3_mk_probe, [:ctx_pointer, :string], :probe_pointer
354
+ attach_function :Z3_mk_re_complement, [:ctx_pointer, :ast_pointer], :ast_pointer
355
+ attach_function :Z3_mk_re_empty, [:ctx_pointer, :sort_pointer], :ast_pointer
356
+ attach_function :Z3_mk_re_full, [:ctx_pointer, :sort_pointer], :ast_pointer
357
+ attach_function :Z3_mk_re_loop, [:ctx_pointer, :ast_pointer, :uint, :uint], :ast_pointer
358
+ attach_function :Z3_mk_re_range, [:ctx_pointer, :ast_pointer, :ast_pointer], :ast_pointer
329
359
  attach_function :Z3_mk_real, [:ctx_pointer, :int, :int], :ast_pointer
330
360
  attach_function :Z3_mk_real2int, [:ctx_pointer, :ast_pointer], :ast_pointer
331
361
  attach_function :Z3_mk_real_sort, [:ctx_pointer], :sort_pointer
@@ -347,6 +377,7 @@ module Z3
347
377
  attach_function :Z3_mk_solver_for_logic, [:ctx_pointer, :symbol_pointer], :solver_pointer
348
378
  attach_function :Z3_mk_solver_from_tactic, [:ctx_pointer, :tactic_pointer], :solver_pointer
349
379
  attach_function :Z3_mk_store, [:ctx_pointer, :ast_pointer, :ast_pointer, :ast_pointer], :ast_pointer
380
+ attach_function :Z3_mk_str_to_int, [:ctx_pointer, :ast_pointer], :ast_pointer
350
381
  attach_function :Z3_mk_string_symbol, [:ctx_pointer, :string], :symbol_pointer
351
382
  attach_function :Z3_mk_tactic, [:ctx_pointer, :string], :tactic_pointer
352
383
  attach_function :Z3_mk_true, [:ctx_pointer], :ast_pointer
@@ -357,6 +388,7 @@ module Z3
357
388
  attach_function :Z3_mk_xor, [:ctx_pointer, :ast_pointer, :ast_pointer], :ast_pointer
358
389
  attach_function :Z3_mk_zero_ext, [:ctx_pointer, :uint, :ast_pointer], :ast_pointer
359
390
  attach_function :Z3_model_dec_ref, [:ctx_pointer, :model_pointer], :void
391
+ attach_function :Z3_model_extrapolate, [:ctx_pointer, :model_pointer, :ast_pointer], :ast_pointer
360
392
  attach_function :Z3_model_get_const_decl, [:ctx_pointer, :model_pointer, :uint], :func_decl_pointer
361
393
  attach_function :Z3_model_get_const_interp, [:ctx_pointer, :model_pointer, :func_decl_pointer], :ast_pointer
362
394
  attach_function :Z3_model_get_func_decl, [:ctx_pointer, :model_pointer, :uint], :func_decl_pointer
@@ -373,13 +405,19 @@ module Z3
373
405
  attach_function :Z3_optimize_assert_soft, [:ctx_pointer, :optimize_pointer, :ast_pointer, :string, :symbol_pointer], :uint
374
406
  attach_function :Z3_optimize_check, [:ctx_pointer, :optimize_pointer], :int
375
407
  attach_function :Z3_optimize_dec_ref, [:ctx_pointer, :optimize_pointer], :void
408
+ attach_function :Z3_optimize_from_file, [:ctx_pointer, :optimize_pointer, :string], :void
409
+ attach_function :Z3_optimize_from_string, [:ctx_pointer, :optimize_pointer, :string], :void
410
+ attach_function :Z3_optimize_get_assertions, [:ctx_pointer, :optimize_pointer], :ast_vector_pointer
376
411
  attach_function :Z3_optimize_get_help, [:ctx_pointer, :optimize_pointer], :string
377
412
  attach_function :Z3_optimize_get_lower, [:ctx_pointer, :optimize_pointer, :uint], :ast_pointer
413
+ attach_function :Z3_optimize_get_lower_as_vector, [:ctx_pointer, :optimize_pointer, :uint], :ast_vector_pointer
378
414
  attach_function :Z3_optimize_get_model, [:ctx_pointer, :optimize_pointer], :model_pointer
415
+ attach_function :Z3_optimize_get_objectives, [:ctx_pointer, :optimize_pointer], :ast_vector_pointer
379
416
  attach_function :Z3_optimize_get_param_descrs, [:ctx_pointer, :optimize_pointer], :param_descrs_pointer
380
417
  attach_function :Z3_optimize_get_reason_unknown, [:ctx_pointer, :optimize_pointer], :string
381
418
  attach_function :Z3_optimize_get_statistics, [:ctx_pointer, :optimize_pointer], :stats_pointer
382
419
  attach_function :Z3_optimize_get_upper, [:ctx_pointer, :optimize_pointer, :uint], :ast_pointer
420
+ attach_function :Z3_optimize_get_upper_as_vector, [:ctx_pointer, :optimize_pointer, :uint], :ast_vector_pointer
383
421
  attach_function :Z3_optimize_inc_ref, [:ctx_pointer, :optimize_pointer], :void
384
422
  attach_function :Z3_optimize_maximize, [:ctx_pointer, :optimize_pointer, :ast_pointer], :uint
385
423
  attach_function :Z3_optimize_minimize, [:ctx_pointer, :optimize_pointer, :ast_pointer], :uint
@@ -416,6 +454,7 @@ module Z3
416
454
  attach_function :Z3_probe_lt, [:ctx_pointer, :probe_pointer, :probe_pointer], :probe_pointer
417
455
  attach_function :Z3_probe_not, [:ctx_pointer, :probe_pointer], :probe_pointer
418
456
  attach_function :Z3_probe_or, [:ctx_pointer, :probe_pointer, :probe_pointer], :probe_pointer
457
+ attach_function :Z3_qe_lite, [:ctx_pointer, :ast_vector_pointer, :ast_pointer], :ast_pointer
419
458
  attach_function :Z3_rcf_add, [:ctx_pointer, :rcf_num_pointer, :rcf_num_pointer], :rcf_num_pointer
420
459
  attach_function :Z3_rcf_del, [:ctx_pointer, :rcf_num_pointer], :void
421
460
  attach_function :Z3_rcf_div, [:ctx_pointer, :rcf_num_pointer, :rcf_num_pointer], :rcf_num_pointer
@@ -447,7 +486,10 @@ module Z3
447
486
  attach_function :Z3_solver_assert_and_track, [:ctx_pointer, :solver_pointer, :ast_pointer, :ast_pointer], :void
448
487
  attach_function :Z3_solver_check, [:ctx_pointer, :solver_pointer], :int
449
488
  attach_function :Z3_solver_dec_ref, [:ctx_pointer, :solver_pointer], :void
489
+ attach_function :Z3_solver_from_file, [:ctx_pointer, :solver_pointer, :string], :void
490
+ attach_function :Z3_solver_from_string, [:ctx_pointer, :solver_pointer, :string], :void
450
491
  attach_function :Z3_solver_get_assertions, [:ctx_pointer, :solver_pointer], :ast_vector_pointer
492
+ attach_function :Z3_solver_get_consequences, [:ctx_pointer, :solver_pointer, :ast_vector_pointer, :ast_vector_pointer, :ast_vector_pointer], :int
451
493
  attach_function :Z3_solver_get_help, [:ctx_pointer, :solver_pointer], :string
452
494
  attach_function :Z3_solver_get_model, [:ctx_pointer, :solver_pointer], :model_pointer
453
495
  attach_function :Z3_solver_get_num_scopes, [:ctx_pointer, :solver_pointer], :uint
@@ -1,6 +1,7 @@
1
1
  module Z3
2
2
  describe FloatExpr do
3
3
  let(:mode) { RoundingModeSort.new }
4
+ let(:float_single) { FloatSort.new(:single) }
4
5
  let(:float_double) { FloatSort.new(:double) }
5
6
  let(:a) { float_double.var("a") }
6
7
  let(:b) { float_double.var("b") }
@@ -62,12 +63,12 @@ module Z3
62
63
  )
63
64
  end
64
65
 
65
- # Broken in z3
66
- # it "max" do
67
- # expect([a == 2.0, b == 3.0, c == a.max(b)]).to have_solution(
68
- # c => float_double.from_const(3.0),
69
- # )
70
- # end
66
+ # Broken in z3 before 4.6
67
+ it "max" do
68
+ expect([a == 2.0, b == 3.0, c == a.max(b)]).to have_solution(
69
+ c => float_double.from_const(3.0),
70
+ )
71
+ end
71
72
 
72
73
  it "min" do
73
74
  expect([a == 2.0, b == 3.0, c == a.min(b)]).to have_solution(
@@ -104,6 +105,15 @@ module Z3
104
105
  # Denormals changed
105
106
  if Z3.version >= '4.5'
106
107
  expect(float_double.from_const(1234 * 0.5**1040).to_s).to eq("0.00470733642578125B-1022")
108
+ expect(float_single.from_const(1234 * 0.5**136).to_s).to eq("1.205078125B-126")
109
+ # This is what we get, all of these are wrong, by a lot:
110
+ # expect(float_single.from_const(1234 * 0.5**137).to_s).to eq("0.205078125B-126")
111
+ # expect(float_single.from_const(1234 * 0.5**138).to_s).to eq("0.205078125B-126")
112
+ # expect(float_single.from_const(1234 * 0.5**139).to_s).to eq("0.205078125B-126")
113
+ #
114
+ # It's not even a bug in printer Z3_mk_fpa_numeral_double is broken for denormals
115
+ #
116
+ # Probably best revisit it in 4.7+
107
117
  else
108
118
  expect(float_double.from_const(1234 * 0.5**1040).to_s).to eq("1.205078125B-1030")
109
119
  end
@@ -0,0 +1,76 @@
1
+ # Optimize and Model specs are codependent, so half of functionality of each is tested in other class's tests
2
+ module Z3
3
+ describe Optimize do
4
+ let(:optimize) { Optimize.new }
5
+ let(:a) { Z3.Int("a") }
6
+ let(:b) { Z3.Int("b") }
7
+
8
+ it "basic functionality" do
9
+ optimize.assert(a == b)
10
+ expect(optimize).to be_satisfiable
11
+ optimize.assert(a != b)
12
+ expect(optimize).to be_unsatisfiable
13
+ end
14
+
15
+ it "push/pop" do
16
+ optimize.assert(a == b)
17
+ optimize.push
18
+ optimize.assert(a != b)
19
+ expect(optimize).to be_unsatisfiable
20
+ optimize.pop
21
+ expect(optimize).to be_satisfiable
22
+ end
23
+
24
+ it "#assertions" do
25
+ optimize.assert a + b == 4
26
+ optimize.assert b >= 2
27
+ optimize.assert Z3.Or(a == 2, a == -2)
28
+ expect(optimize.assertions).to be_same_as([
29
+ a + b == 4,
30
+ b >= 2,
31
+ (a == 2) | (a == -2),
32
+ ])
33
+ end
34
+
35
+ it "#statistics" do
36
+ optimize.assert a + b == 4
37
+ optimize.assert b >= 2
38
+ optimize.assert Z3.Or(a == 2, a == -2)
39
+ stats = optimize.statistics
40
+ expect(stats.keys).to match_array(["rlimit count", "max memory", "memory", "num allocs"])
41
+ end
42
+
43
+ # This is a very simple example of unknown satisfiablity
44
+ # so we might need more complex one in the future
45
+ # Unlike Z3::Solver, this is unknown even 4.6.0
46
+ it "third way" do
47
+ optimize.assert a**3 == a
48
+ expect(optimize.check).to eq(:unknown)
49
+ expect{optimize.satisfiable?}.to raise_error("Satisfiability unknown")
50
+ expect{optimize.unsatisfiable?}.to raise_error("Satisfiability unknown")
51
+ end
52
+
53
+ it "third way" do
54
+ optimize.assert a**a == a
55
+ expect(optimize.check).to eq(:unknown)
56
+ expect{optimize.satisfiable?}.to raise_error("Satisfiability unknown")
57
+ expect{optimize.unsatisfiable?}.to raise_error("Satisfiability unknown")
58
+ end
59
+
60
+ it "maximize" do
61
+ optimize.assert a > 0
62
+ optimize.assert a < 10
63
+ optimize.maximize a
64
+ expect(optimize).to be_satisfiable
65
+ expect(optimize.model[a].to_i).to eq 9
66
+ end
67
+
68
+ it "maximize" do
69
+ optimize.assert a > 0
70
+ optimize.assert a < 10
71
+ optimize.minimize a
72
+ expect(optimize).to be_satisfiable
73
+ expect(optimize.model[a].to_i).to eq 1
74
+ end
75
+ end
76
+ end
@@ -7,6 +7,7 @@ module Z3
7
7
 
8
8
  it "+" do
9
9
  expect([a == 2, b == 4, c == a + b]).to have_solution(c => 6)
10
+ expect([a == Rational(1,3), b == Rational(3,2), c == a + b]).to have_solution(c => "11/6")
10
11
  end
11
12
 
12
13
  it "-" do
@@ -67,6 +68,7 @@ module Z3
67
68
  expect([a == 3, b == -a]).to have_solution(b => -3)
68
69
  expect([a == 0, b == -a]).to have_solution(b => 0)
69
70
  expect([a == 3.5, b == -a]).to have_solution(b => "-7/2")
71
+ expect([a == Rational(4,3), b == -a]).to have_solution(b => "-4/3")
70
72
  end
71
73
  end
72
74
  end
@@ -9,6 +9,8 @@ module Z3
9
9
  expect(subject.from_const(-0.0).inspect).to eq("Real<0>")
10
10
  expect(subject.from_const(3.14).inspect).to eq("Real<157/50>")
11
11
  expect(subject.from_const(-3.14).inspect).to eq("Real<-157/50>")
12
+ expect(subject.from_const(Rational(22,7)).inspect).to eq("Real<22/7>")
13
+ expect(subject.from_const(Rational(-22,7)).inspect).to eq("Real<-22/7>")
12
14
  end
13
15
 
14
16
  it "raises exception when trying to convert constants of wrong type" do
@@ -11,28 +11,17 @@ require_relative "../lib/z3"
11
11
 
12
12
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
13
13
  RSpec.configure do |config|
14
- # rspec-expectations config goes here. You can use an alternate
15
- # assertion/expectation library such as wrong or the stdlib/minitest
16
- # assertions if you prefer.
17
14
  config.expect_with :rspec do |expectations|
18
- # This option will default to `true` in RSpec 4. It makes the `description`
19
- # and `failure_message` of custom matchers include text for helper methods
20
- # defined using `chain`, e.g.:
21
- # be_bigger_than(2).and_smaller_than(4).description
22
- # # => "be bigger than 2 and smaller than 4"
23
- # ...rather than:
24
- # # => "be bigger than 2"
25
15
  expectations.include_chain_clauses_in_custom_matcher_descriptions = true
26
16
  end
27
17
 
28
- # rspec-mocks config goes here. You can use an alternate test double
29
- # library (such as bogus or mocha) by changing the `mock_with` option here.
30
18
  config.mock_with :rspec do |mocks|
31
- # Prevents you from mocking or stubbing a method that does not exist on
32
- # a real object. This is generally recommended, and will default to
33
- # `true` in RSpec 4.
34
19
  mocks.verify_partial_doubles = true
35
20
  end
21
+
22
+ config.define_derived_metadata do |meta|
23
+ meta[:aggregate_failures] = true
24
+ end
36
25
  end
37
26
 
38
27
  RSpec::Matchers.define :have_output do |expected|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: z3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.20180203
4
+ version: 0.0.20180616
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomasz Wegrzanowski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-03 00:00:00.000000000 Z
11
+ date: 2018-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -177,6 +177,7 @@ files:
177
177
  - lib/z3/low_level.rb
178
178
  - lib/z3/low_level_auto.rb
179
179
  - lib/z3/model.rb
180
+ - lib/z3/optimize.rb
180
181
  - lib/z3/printer.rb
181
182
  - lib/z3/probe.rb
182
183
  - lib/z3/solver.rb
@@ -231,6 +232,7 @@ files:
231
232
  - spec/integration/verbal_arithmetic_spec.rb
232
233
  - spec/integration/zebra_puzzle_spec.rb
233
234
  - spec/model_spec.rb
235
+ - spec/optimize_spec.rb
234
236
  - spec/printer_spec.rb
235
237
  - spec/probe_spec.rb
236
238
  - spec/real_expr_spec.rb