z3 0.0.20180629 → 0.0.20220203

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -4
  3. data/Rakefile +15 -8
  4. data/examples/abc_path +187 -0
  5. data/examples/abc_path-1.txt +7 -0
  6. data/examples/algebra_problems +12 -12
  7. data/examples/aquarium +133 -0
  8. data/examples/aquarium-1.txt +11 -0
  9. data/examples/bridges +2 -2
  10. data/examples/cats_organized_neatly +133 -0
  11. data/examples/cats_organized_neatly-10.txt +15 -0
  12. data/examples/cats_organized_neatly-3.txt +8 -0
  13. data/examples/cats_organized_neatly-48.txt +32 -0
  14. data/examples/circuit_problems +4 -4
  15. data/examples/clogic_puzzle +2 -2
  16. data/examples/color_nonogram +150 -0
  17. data/examples/color_nonogram-1.txt +23 -0
  18. data/examples/crossflip +2 -4
  19. data/examples/dominion +153 -0
  20. data/examples/dominion-1.txt +8 -0
  21. data/examples/dominosa +133 -0
  22. data/examples/dominosa-1.txt +8 -0
  23. data/examples/eulero +99 -0
  24. data/examples/eulero-1.txt +5 -0
  25. data/examples/four_hackers_puzzle +2 -2
  26. data/examples/futoshiki +128 -0
  27. data/examples/futoshiki-1.txt +17 -0
  28. data/examples/kakurasu +73 -0
  29. data/examples/kakurasu-1.txt +2 -0
  30. data/examples/kakuro +2 -2
  31. data/examples/killer_sudoku +88 -0
  32. data/examples/killer_sudoku-1.txt +17 -0
  33. data/examples/killer_sudoku-2.txt +53 -0
  34. data/examples/kinematics_problems +20 -20
  35. data/examples/knights_puzzle +2 -2
  36. data/examples/kropki +100 -0
  37. data/examples/kropki-1.txt +13 -0
  38. data/examples/letter_connections +2 -2
  39. data/examples/light_up +2 -2
  40. data/examples/minisudoku +2 -2
  41. data/examples/miracle_sudoku +135 -0
  42. data/examples/miracle_sudoku-1.txt +9 -0
  43. data/examples/mortal_coil_puzzle +2 -2
  44. data/examples/nanro +245 -0
  45. data/examples/nanro-1.txt +8 -0
  46. data/examples/nine_clocks +106 -0
  47. data/examples/nonogram +2 -2
  48. data/examples/pyramid_nonogram +2 -2
  49. data/examples/regexp_crossword_solver +2 -2
  50. data/examples/regexp_solver +2 -2
  51. data/examples/renzoku +124 -0
  52. data/examples/renzoku-1.txt +17 -0
  53. data/examples/sandwich_sudoku +101 -0
  54. data/examples/sandwich_sudoku-1.txt +10 -0
  55. data/examples/selfref +2 -2
  56. data/examples/simple_regexp_parser.rb +58 -56
  57. data/examples/skyscrapers +118 -0
  58. data/examples/skyscrapers-1.txt +6 -0
  59. data/examples/skyscrapers-2.txt +11 -0
  60. data/examples/star_battle +134 -0
  61. data/examples/star_battle-1.txt +10 -0
  62. data/examples/stitches +180 -0
  63. data/examples/stitches-1.txt +11 -0
  64. data/examples/sudoku +2 -2
  65. data/examples/suguru +199 -0
  66. data/examples/suguru-1.txt +17 -0
  67. data/examples/verbal_arithmetic +2 -2
  68. data/examples/yajilin +268 -0
  69. data/examples/yajilin-1.txt +10 -0
  70. data/lib/z3/ast.rb +8 -0
  71. data/lib/z3/expr/expr.rb +16 -15
  72. data/lib/z3/low_level.rb +6 -2
  73. data/lib/z3/low_level_auto.rb +180 -36
  74. data/lib/z3/optimize.rb +4 -4
  75. data/lib/z3/very_low_level.rb +8 -5
  76. data/lib/z3/very_low_level_auto.rb +45 -9
  77. data/spec/expr_spec.rb +62 -0
  78. data/spec/integration/abc_path_spec.rb +21 -0
  79. data/spec/integration/aquarium_spec.rb +27 -0
  80. data/spec/integration/cats_organized_neatly_spec.rb +14 -0
  81. data/spec/integration/color_nonogram_spec.rb +28 -0
  82. data/spec/integration/dominion_spec.rb +14 -0
  83. data/spec/integration/dominosa_spec.rb +21 -0
  84. data/spec/integration/eulero_spec.rb +11 -0
  85. data/spec/integration/futoshiki_spec.rb +23 -0
  86. data/spec/integration/kakurasu_spec.rb +18 -0
  87. data/spec/integration/killer_sudoku_spec.rb +10 -0
  88. data/spec/integration/knights_puzzle_spec.rb +11 -11
  89. data/spec/integration/kropki_spec.rb +19 -0
  90. data/spec/integration/miracle_sudoku_spec.rb +15 -0
  91. data/spec/integration/mortal_coil_puzzle_spec.rb +8 -6
  92. data/spec/integration/nanro_spec.rb +39 -0
  93. data/spec/integration/nine_clocks_spec.rb +30 -0
  94. data/spec/integration/oneofus_spec.rb +7 -15
  95. data/spec/integration/regexp_crossword_solver_spec.rb +1 -1
  96. data/spec/integration/renzoku_spec.rb +23 -0
  97. data/spec/integration/sandwich_sudoku_spec.rb +15 -0
  98. data/spec/integration/skyscraper_spec.rb +10 -0
  99. data/spec/integration/star_battle_spec.rb +27 -0
  100. data/spec/integration/stitches_spec.rb +25 -0
  101. data/spec/integration/suguru_spec.rb +23 -0
  102. data/spec/integration/yajilin_spec.rb +25 -0
  103. data/spec/optimize_spec.rb +6 -4
  104. data/spec/set_expr_spec.rb +14 -8
  105. data/spec/solver_spec.rb +4 -5
  106. data/spec/spec_helper.rb +15 -0
  107. metadata +105 -25
data/lib/z3/ast.rb CHANGED
@@ -46,6 +46,14 @@ module Z3
46
46
  sort.new(LowLevel.simplify(self))
47
47
  end
48
48
 
49
+ def eql?(other)
50
+ self.class == other.class and self._ast == other._ast
51
+ end
52
+
53
+ def hash
54
+ _ast.address
55
+ end
56
+
49
57
  private_class_method :new
50
58
  end
51
59
  end
data/lib/z3/expr/expr.rb CHANGED
@@ -1,10 +1,11 @@
1
1
  module Z3
2
2
  class Expr < AST
3
3
  attr_reader :sort
4
+
4
5
  def initialize(_ast, sort)
5
6
  super(_ast)
6
7
  @sort = sort
7
- raise Z3::Exception, "Values must have AST kind numeral or app" unless [:numeral, :app].include?(ast_kind)
8
+ raise Z3::Exception, "Values must have AST kind numeral, app, or quantifier" unless [:numeral, :app, :quantifier].include?(ast_kind)
8
9
  end
9
10
 
10
11
  def inspect
@@ -22,7 +23,7 @@ module Z3
22
23
  class << self
23
24
  def coerce_to_same_sort(*args)
24
25
  # This will raise exception unless one of the sorts is highest
25
- max_sort = args.map{|a| a.is_a?(Expr) ? a.sort : Expr.sort_for_const(a)}.max
26
+ max_sort = args.map { |a| a.is_a?(Expr) ? a.sort : Expr.sort_for_const(a) }.max
26
27
  args.map do |a|
27
28
  max_sort.cast(a)
28
29
  end
@@ -110,11 +111,11 @@ module Z3
110
111
  when BoolExpr
111
112
  BoolSort.new.new(Z3::LowLevel.mk_and(args))
112
113
  when BitvecExpr
113
- args.inject do |a,b|
114
+ args.inject do |a, b|
114
115
  a.sort.new(Z3::LowLevel.mk_bvand(a, b))
115
116
  end
116
117
  else
117
- raise Z3::Exception, "Can't perform logic operations on #{a.sort} exprs, only Bool and Bitvec"
118
+ raise Z3::Exception, "Can't perform logic operations on #{args[0].sort} exprs, only Bool and Bitvec"
118
119
  end
119
120
  end
120
121
 
@@ -124,11 +125,11 @@ module Z3
124
125
  when BoolExpr
125
126
  BoolSort.new.new(Z3::LowLevel.mk_or(args))
126
127
  when BitvecExpr
127
- args.inject do |a,b|
128
+ args.inject do |a, b|
128
129
  a.sort.new(Z3::LowLevel.mk_bvor(a, b))
129
130
  end
130
131
  else
131
- raise Z3::Exception, "Can't perform logic operations on #{a.sort} exprs, only Bool and Bitvec"
132
+ raise Z3::Exception, "Can't perform logic operations on #{args[0].sort} exprs, only Bool and Bitvec"
132
133
  end
133
134
  end
134
135
 
@@ -136,15 +137,15 @@ module Z3
136
137
  args = coerce_to_same_sort(*args)
137
138
  case args[0]
138
139
  when BoolExpr
139
- args.inject do |a,b|
140
+ args.inject do |a, b|
140
141
  BoolSort.new.new(Z3::LowLevel.mk_xor(a, b))
141
142
  end
142
143
  when BitvecExpr
143
- args.inject do |a,b|
144
+ args.inject do |a, b|
144
145
  a.sort.new(Z3::LowLevel.mk_bvxor(a, b))
145
146
  end
146
147
  else
147
- raise Z3::Exception, "Can't perform logic operations on #{a.sort} exprs, only Bool and Bitvec"
148
+ raise Z3::Exception, "Can't perform logic operations on #{args[0].sort} exprs, only Bool and Bitvec"
148
149
  end
149
150
  end
150
151
 
@@ -155,8 +156,8 @@ module Z3
155
156
  when ArithExpr
156
157
  args[0].sort.new(LowLevel.mk_add(args))
157
158
  when BitvecExpr
158
- args.inject do |a,b|
159
- a.sort.new(LowLevel.mk_bvadd(a,b))
159
+ args.inject do |a, b|
160
+ a.sort.new(LowLevel.mk_bvadd(a, b))
160
161
  end
161
162
  else
162
163
  raise Z3::Exception, "Can't perform logic operations on #{args[0].sort} exprs, only Int/Real/Bitvec"
@@ -169,8 +170,8 @@ module Z3
169
170
  when ArithExpr
170
171
  args[0].sort.new(LowLevel.mk_sub(args))
171
172
  when BitvecExpr
172
- args.inject do |a,b|
173
- a.sort.new(LowLevel.mk_bvsub(a,b))
173
+ args.inject do |a, b|
174
+ a.sort.new(LowLevel.mk_bvsub(a, b))
174
175
  end
175
176
  else
176
177
  raise Z3::Exception, "Can't perform logic operations on #{args[0].sort} values, only Int/Real/Bitvec"
@@ -183,8 +184,8 @@ module Z3
183
184
  when ArithExpr
184
185
  args[0].sort.new(LowLevel.mk_mul(args))
185
186
  when BitvecExpr
186
- args.inject do |a,b|
187
- a.sort.new(LowLevel.mk_bvmul(a,b))
187
+ args.inject do |a, b|
188
+ a.sort.new(LowLevel.mk_bvmul(a, b))
188
189
  end
189
190
  else
190
191
  raise Z3::Exception, "Can't perform logic operations on #{args[0].sort} values, only Int/Real/Bitvec"
data/lib/z3/low_level.rb CHANGED
@@ -9,7 +9,7 @@ module Z3
9
9
  b = FFI::MemoryPointer.new(:int)
10
10
  c = FFI::MemoryPointer.new(:int)
11
11
  d = FFI::MemoryPointer.new(:int)
12
- Z3::VeryLowLevel.Z3_get_version(a,b,c,d)
12
+ Z3::VeryLowLevel.Z3_get_version(a, b, c, d)
13
13
  [a.get_uint(0), b.get_uint(0), c.get_uint(0), d.get_uint(0)]
14
14
  end
15
15
 
@@ -63,6 +63,10 @@ module Z3
63
63
  Z3::VeryLowLevel.Z3_mk_set_intersect(_ctx_pointer, asts.size, asts_vector(asts))
64
64
  end
65
65
 
66
+ def optimize_check(optimize, asts)
67
+ Z3::VeryLowLevel.Z3_optimize_check(_ctx_pointer, optimize._optimize, asts.size, asts_vector(asts))
68
+ end
69
+
66
70
  # Should be private
67
71
 
68
72
  def unpack_ast_vector(_ast_vector)
@@ -96,7 +100,7 @@ module Z3
96
100
  private
97
101
 
98
102
  def asts_vector(args)
99
- raise if args.empty?
103
+ # raise if args.empty?
100
104
  c_args = FFI::MemoryPointer.new(:pointer, args.size)
101
105
  c_args.write_array_of_pointer args.map(&:_ast)
102
106
  c_args
@@ -25,6 +25,14 @@ module Z3
25
25
  VeryLowLevel.Z3_algebraic_ge(_ctx_pointer, ast1._ast, ast2._ast)
26
26
  end
27
27
 
28
+ def algebraic_get_i(ast) #=> :uint
29
+ VeryLowLevel.Z3_algebraic_get_i(_ctx_pointer, ast._ast)
30
+ end
31
+
32
+ def algebraic_get_poly(ast) #=> :ast_vector_pointer
33
+ VeryLowLevel.Z3_algebraic_get_poly(_ctx_pointer, ast._ast)
34
+ end
35
+
28
36
  def algebraic_gt(ast1, ast2) #=> :bool
29
37
  VeryLowLevel.Z3_algebraic_gt(_ctx_pointer, ast1._ast, ast2._ast)
30
38
  end
@@ -77,10 +85,6 @@ module Z3
77
85
  VeryLowLevel.Z3_algebraic_sub(_ctx_pointer, ast1._ast, ast2._ast)
78
86
  end
79
87
 
80
- def apply_result_convert_model(apply_result, num, model) #=> :model_pointer
81
- VeryLowLevel.Z3_apply_result_convert_model(_ctx_pointer, apply_result._apply_result, num, model._model)
82
- end
83
-
84
88
  def apply_result_dec_ref(apply_result) #=> :void
85
89
  VeryLowLevel.Z3_apply_result_dec_ref(_ctx_pointer, apply_result._apply_result)
86
90
  end
@@ -213,6 +217,10 @@ module Z3
213
217
  VeryLowLevel.Z3_enable_trace(str)
214
218
  end
215
219
 
220
+ def eval_smtlib2_string(str) #=> :string
221
+ VeryLowLevel.Z3_eval_smtlib2_string(_ctx_pointer, str)
222
+ end
223
+
216
224
  def finalize_memory #=> :void
217
225
  VeryLowLevel.Z3_finalize_memory()
218
226
  end
@@ -301,14 +309,6 @@ module Z3
301
309
  VeryLowLevel.Z3_fixedpoint_inc_ref(_ctx_pointer, fixedpoint._fixedpoint)
302
310
  end
303
311
 
304
- def fixedpoint_pop(fixedpoint) #=> :void
305
- VeryLowLevel.Z3_fixedpoint_pop(_ctx_pointer, fixedpoint._fixedpoint)
306
- end
307
-
308
- def fixedpoint_push(fixedpoint) #=> :void
309
- VeryLowLevel.Z3_fixedpoint_push(_ctx_pointer, fixedpoint._fixedpoint)
310
- end
311
-
312
312
  def fixedpoint_query(fixedpoint, ast) #=> :int
313
313
  VeryLowLevel.Z3_fixedpoint_query(_ctx_pointer, fixedpoint._fixedpoint, ast._ast)
314
314
  end
@@ -581,10 +581,6 @@ module Z3
581
581
  VeryLowLevel.Z3_get_index_value(_ctx_pointer, ast._ast)
582
582
  end
583
583
 
584
- def get_interpolant(ast1, ast2, params) #=> :ast_vector_pointer
585
- VeryLowLevel.Z3_get_interpolant(_ctx_pointer, ast1._ast, ast2._ast, params._params)
586
- end
587
-
588
584
  def get_num_probes #=> :uint
589
585
  VeryLowLevel.Z3_get_num_probes(_ctx_pointer)
590
586
  end
@@ -593,10 +589,18 @@ module Z3
593
589
  VeryLowLevel.Z3_get_num_tactics(_ctx_pointer)
594
590
  end
595
591
 
592
+ def get_numeral_binary_string(ast) #=> :string
593
+ VeryLowLevel.Z3_get_numeral_binary_string(_ctx_pointer, ast._ast)
594
+ end
595
+
596
596
  def get_numeral_decimal_string(ast, num) #=> :string
597
597
  VeryLowLevel.Z3_get_numeral_decimal_string(_ctx_pointer, ast._ast, num)
598
598
  end
599
599
 
600
+ def get_numeral_double(ast) #=> :double
601
+ VeryLowLevel.Z3_get_numeral_double(_ctx_pointer, ast._ast)
602
+ end
603
+
600
604
  def get_numeral_string(ast) #=> :string
601
605
  VeryLowLevel.Z3_get_numeral_string(_ctx_pointer, ast._ast)
602
606
  end
@@ -605,10 +609,6 @@ module Z3
605
609
  VeryLowLevel.Z3_get_numerator(_ctx_pointer, ast._ast)
606
610
  end
607
611
 
608
- def get_parser_error #=> :string
609
- VeryLowLevel.Z3_get_parser_error(_ctx_pointer)
610
- end
611
-
612
612
  def get_pattern(pattern, num) #=> :ast_pointer
613
613
  VeryLowLevel.Z3_get_pattern(_ctx_pointer, pattern._ast, num)
614
614
  end
@@ -661,6 +661,10 @@ module Z3
661
661
  VeryLowLevel.Z3_get_range(_ctx_pointer, func_decl._ast)
662
662
  end
663
663
 
664
+ def get_re_sort_basis(sort) #=> :sort_pointer
665
+ VeryLowLevel.Z3_get_re_sort_basis(_ctx_pointer, sort._ast)
666
+ end
667
+
664
668
  def get_relation_arity(sort) #=> :uint
665
669
  VeryLowLevel.Z3_get_relation_arity(_ctx_pointer, sort._ast)
666
670
  end
@@ -669,6 +673,10 @@ module Z3
669
673
  VeryLowLevel.Z3_get_relation_column(_ctx_pointer, sort._ast, num)
670
674
  end
671
675
 
676
+ def get_seq_sort_basis(sort) #=> :sort_pointer
677
+ VeryLowLevel.Z3_get_seq_sort_basis(_ctx_pointer, sort._ast)
678
+ end
679
+
672
680
  def get_sort(ast) #=> :sort_pointer
673
681
  VeryLowLevel.Z3_get_sort(_ctx_pointer, ast._ast)
674
682
  end
@@ -685,6 +693,10 @@ module Z3
685
693
  VeryLowLevel.Z3_get_sort_name(_ctx_pointer, sort._ast)
686
694
  end
687
695
 
696
+ def get_string_length(ast) #=> :uint
697
+ VeryLowLevel.Z3_get_string_length(_ctx_pointer, ast._ast)
698
+ end
699
+
688
700
  def get_symbol_int(sym) #=> :int
689
701
  VeryLowLevel.Z3_get_symbol_int(_ctx_pointer, sym)
690
702
  end
@@ -725,6 +737,10 @@ module Z3
725
737
  VeryLowLevel.Z3_goal_assert(_ctx_pointer, goal._goal, ast._ast)
726
738
  end
727
739
 
740
+ def goal_convert_model(goal, model) #=> :model_pointer
741
+ VeryLowLevel.Z3_goal_convert_model(_ctx_pointer, goal._goal, model._model)
742
+ end
743
+
728
744
  def goal_dec_ref(goal) #=> :void
729
745
  VeryLowLevel.Z3_goal_dec_ref(_ctx_pointer, goal._goal)
730
746
  end
@@ -769,6 +785,10 @@ module Z3
769
785
  VeryLowLevel.Z3_goal_size(_ctx_pointer, goal._goal)
770
786
  end
771
787
 
788
+ def goal_to_dimacs_string(goal, bool) #=> :string
789
+ VeryLowLevel.Z3_goal_to_dimacs_string(_ctx_pointer, goal._goal, bool)
790
+ end
791
+
772
792
  def goal_to_string(goal) #=> :string
773
793
  VeryLowLevel.Z3_goal_to_string(_ctx_pointer, goal._goal)
774
794
  end
@@ -781,10 +801,6 @@ module Z3
781
801
  VeryLowLevel.Z3_inc_ref(_ctx_pointer, ast._ast)
782
802
  end
783
803
 
784
- def interpolation_profile #=> :string
785
- VeryLowLevel.Z3_interpolation_profile(_ctx_pointer)
786
- end
787
-
788
804
  def interrupt #=> :void
789
805
  VeryLowLevel.Z3_interrupt(_ctx_pointer)
790
806
  end
@@ -801,6 +817,10 @@ module Z3
801
817
  VeryLowLevel.Z3_is_as_array(_ctx_pointer, ast._ast)
802
818
  end
803
819
 
820
+ def is_char_sort(sort) #=> :bool
821
+ VeryLowLevel.Z3_is_char_sort(_ctx_pointer, sort._ast)
822
+ end
823
+
804
824
  def is_eq_ast(ast1, ast2) #=> :bool
805
825
  VeryLowLevel.Z3_is_eq_ast(_ctx_pointer, ast1._ast, ast2._ast)
806
826
  end
@@ -813,10 +833,18 @@ module Z3
813
833
  VeryLowLevel.Z3_is_eq_sort(_ctx_pointer, sort1._ast, sort2._ast)
814
834
  end
815
835
 
836
+ def is_lambda(ast) #=> :bool
837
+ VeryLowLevel.Z3_is_lambda(_ctx_pointer, ast._ast)
838
+ end
839
+
816
840
  def is_numeral_ast(ast) #=> :bool
817
841
  VeryLowLevel.Z3_is_numeral_ast(_ctx_pointer, ast._ast)
818
842
  end
819
843
 
844
+ def is_quantifier_exists(ast) #=> :bool
845
+ VeryLowLevel.Z3_is_quantifier_exists(_ctx_pointer, ast._ast)
846
+ end
847
+
820
848
  def is_quantifier_forall(ast) #=> :bool
821
849
  VeryLowLevel.Z3_is_quantifier_forall(_ctx_pointer, ast._ast)
822
850
  end
@@ -1009,6 +1037,30 @@ module Z3
1009
1037
  VeryLowLevel.Z3_mk_bvxor(_ctx_pointer, ast1._ast, ast2._ast)
1010
1038
  end
1011
1039
 
1040
+ def mk_char_from_bv(ast) #=> :ast_pointer
1041
+ VeryLowLevel.Z3_mk_char_from_bv(_ctx_pointer, ast._ast)
1042
+ end
1043
+
1044
+ def mk_char_is_digit(ast) #=> :ast_pointer
1045
+ VeryLowLevel.Z3_mk_char_is_digit(_ctx_pointer, ast._ast)
1046
+ end
1047
+
1048
+ def mk_char_le(ast1, ast2) #=> :ast_pointer
1049
+ VeryLowLevel.Z3_mk_char_le(_ctx_pointer, ast1._ast, ast2._ast)
1050
+ end
1051
+
1052
+ def mk_char_sort #=> :sort_pointer
1053
+ VeryLowLevel.Z3_mk_char_sort(_ctx_pointer)
1054
+ end
1055
+
1056
+ def mk_char_to_bv(ast) #=> :ast_pointer
1057
+ VeryLowLevel.Z3_mk_char_to_bv(_ctx_pointer, ast._ast)
1058
+ end
1059
+
1060
+ def mk_char_to_int(ast) #=> :ast_pointer
1061
+ VeryLowLevel.Z3_mk_char_to_int(_ctx_pointer, ast._ast)
1062
+ end
1063
+
1012
1064
  def mk_concat(ast1, ast2) #=> :ast_pointer
1013
1065
  VeryLowLevel.Z3_mk_concat(_ctx_pointer, ast1._ast, ast2._ast)
1014
1066
  end
@@ -1033,6 +1085,10 @@ module Z3
1033
1085
  VeryLowLevel.Z3_mk_div(_ctx_pointer, ast1._ast, ast2._ast)
1034
1086
  end
1035
1087
 
1088
+ def mk_divides(ast1, ast2) #=> :ast_pointer
1089
+ VeryLowLevel.Z3_mk_divides(_ctx_pointer, ast1._ast, ast2._ast)
1090
+ end
1091
+
1036
1092
  def mk_empty_set(sort) #=> :ast_pointer
1037
1093
  VeryLowLevel.Z3_mk_empty_set(_ctx_pointer, sort._ast)
1038
1094
  end
@@ -1349,14 +1405,6 @@ module Z3
1349
1405
  VeryLowLevel.Z3_mk_int_to_str(_ctx_pointer, ast._ast)
1350
1406
  end
1351
1407
 
1352
- def mk_interpolant(ast) #=> :ast_pointer
1353
- VeryLowLevel.Z3_mk_interpolant(_ctx_pointer, ast._ast)
1354
- end
1355
-
1356
- def mk_interpolation_context(config) #=> :ctx_pointer
1357
- VeryLowLevel.Z3_mk_interpolation_context(config._config)
1358
- end
1359
-
1360
1408
  def mk_is_int(ast) #=> :ast_pointer
1361
1409
  VeryLowLevel.Z3_mk_is_int(_ctx_pointer, ast._ast)
1362
1410
  end
@@ -1369,6 +1417,14 @@ module Z3
1369
1417
  VeryLowLevel.Z3_mk_le(_ctx_pointer, ast1._ast, ast2._ast)
1370
1418
  end
1371
1419
 
1420
+ def mk_linear_order(sort, num) #=> :func_decl_pointer
1421
+ VeryLowLevel.Z3_mk_linear_order(_ctx_pointer, sort._ast, num)
1422
+ end
1423
+
1424
+ def mk_lstring(num, str) #=> :ast_pointer
1425
+ VeryLowLevel.Z3_mk_lstring(_ctx_pointer, num, str)
1426
+ end
1427
+
1372
1428
  def mk_lt(ast1, ast2) #=> :ast_pointer
1373
1429
  VeryLowLevel.Z3_mk_lt(_ctx_pointer, ast1._ast, ast2._ast)
1374
1430
  end
@@ -1397,6 +1453,14 @@ module Z3
1397
1453
  VeryLowLevel.Z3_mk_params(_ctx_pointer)
1398
1454
  end
1399
1455
 
1456
+ def mk_partial_order(sort, num) #=> :func_decl_pointer
1457
+ VeryLowLevel.Z3_mk_partial_order(_ctx_pointer, sort._ast, num)
1458
+ end
1459
+
1460
+ def mk_piecewise_linear_order(sort, num) #=> :func_decl_pointer
1461
+ VeryLowLevel.Z3_mk_piecewise_linear_order(_ctx_pointer, sort._ast, num)
1462
+ end
1463
+
1400
1464
  def mk_power(ast1, ast2) #=> :ast_pointer
1401
1465
  VeryLowLevel.Z3_mk_power(_ctx_pointer, ast1._ast, ast2._ast)
1402
1466
  end
@@ -1405,6 +1469,10 @@ module Z3
1405
1469
  VeryLowLevel.Z3_mk_probe(_ctx_pointer, str)
1406
1470
  end
1407
1471
 
1472
+ def mk_re_allchar(sort) #=> :ast_pointer
1473
+ VeryLowLevel.Z3_mk_re_allchar(_ctx_pointer, sort._ast)
1474
+ end
1475
+
1408
1476
  def mk_re_complement(ast) #=> :ast_pointer
1409
1477
  VeryLowLevel.Z3_mk_re_complement(_ctx_pointer, ast._ast)
1410
1478
  end
@@ -1453,10 +1521,22 @@ module Z3
1453
1521
  VeryLowLevel.Z3_mk_rotate_right(_ctx_pointer, num, ast._ast)
1454
1522
  end
1455
1523
 
1524
+ def mk_sbv_to_str(ast) #=> :ast_pointer
1525
+ VeryLowLevel.Z3_mk_sbv_to_str(_ctx_pointer, ast._ast)
1526
+ end
1527
+
1456
1528
  def mk_select(ast1, ast2) #=> :ast_pointer
1457
1529
  VeryLowLevel.Z3_mk_select(_ctx_pointer, ast1._ast, ast2._ast)
1458
1530
  end
1459
1531
 
1532
+ def mk_seq_last_index(ast1, ast2) #=> :ast_pointer
1533
+ VeryLowLevel.Z3_mk_seq_last_index(_ctx_pointer, ast1._ast, ast2._ast)
1534
+ end
1535
+
1536
+ def mk_seq_nth(ast1, ast2) #=> :ast_pointer
1537
+ VeryLowLevel.Z3_mk_seq_nth(_ctx_pointer, ast1._ast, ast2._ast)
1538
+ end
1539
+
1460
1540
  def mk_set_add(ast1, ast2) #=> :ast_pointer
1461
1541
  VeryLowLevel.Z3_mk_set_add(_ctx_pointer, ast1._ast, ast2._ast)
1462
1542
  end
@@ -1473,6 +1553,10 @@ module Z3
1473
1553
  VeryLowLevel.Z3_mk_set_difference(_ctx_pointer, ast1._ast, ast2._ast)
1474
1554
  end
1475
1555
 
1556
+ def mk_set_has_size(ast1, ast2) #=> :ast_pointer
1557
+ VeryLowLevel.Z3_mk_set_has_size(_ctx_pointer, ast1._ast, ast2._ast)
1558
+ end
1559
+
1476
1560
  def mk_set_member(ast1, ast2) #=> :ast_pointer
1477
1561
  VeryLowLevel.Z3_mk_set_member(_ctx_pointer, ast1._ast, ast2._ast)
1478
1562
  end
@@ -1509,6 +1593,14 @@ module Z3
1509
1593
  VeryLowLevel.Z3_mk_store(_ctx_pointer, ast1._ast, ast2._ast, ast3._ast)
1510
1594
  end
1511
1595
 
1596
+ def mk_str_le(ast1, ast2) #=> :ast_pointer
1597
+ VeryLowLevel.Z3_mk_str_le(_ctx_pointer, ast1._ast, ast2._ast)
1598
+ end
1599
+
1600
+ def mk_str_lt(ast1, ast2) #=> :ast_pointer
1601
+ VeryLowLevel.Z3_mk_str_lt(_ctx_pointer, ast1._ast, ast2._ast)
1602
+ end
1603
+
1512
1604
  def mk_str_to_int(ast) #=> :ast_pointer
1513
1605
  VeryLowLevel.Z3_mk_str_to_int(_ctx_pointer, ast._ast)
1514
1606
  end
@@ -1521,10 +1613,22 @@ module Z3
1521
1613
  VeryLowLevel.Z3_mk_tactic(_ctx_pointer, str)
1522
1614
  end
1523
1615
 
1616
+ def mk_transitive_closure(func_decl) #=> :func_decl_pointer
1617
+ VeryLowLevel.Z3_mk_transitive_closure(_ctx_pointer, func_decl._ast)
1618
+ end
1619
+
1620
+ def mk_tree_order(sort, num) #=> :func_decl_pointer
1621
+ VeryLowLevel.Z3_mk_tree_order(_ctx_pointer, sort._ast, num)
1622
+ end
1623
+
1524
1624
  def mk_true #=> :ast_pointer
1525
1625
  VeryLowLevel.Z3_mk_true(_ctx_pointer)
1526
1626
  end
1527
1627
 
1628
+ def mk_ubv_to_str(ast) #=> :ast_pointer
1629
+ VeryLowLevel.Z3_mk_ubv_to_str(_ctx_pointer, ast._ast)
1630
+ end
1631
+
1528
1632
  def mk_unary_minus(ast) #=> :ast_pointer
1529
1633
  VeryLowLevel.Z3_mk_unary_minus(_ctx_pointer, ast._ast)
1530
1634
  end
@@ -1605,16 +1709,20 @@ module Z3
1605
1709
  VeryLowLevel.Z3_model_to_string(_ctx_pointer, model._model)
1606
1710
  end
1607
1711
 
1712
+ def model_translate(model, context) #=> :model_pointer
1713
+ VeryLowLevel.Z3_model_translate(_ctx_pointer, model._model, context._context)
1714
+ end
1715
+
1608
1716
  def optimize_assert(optimize, ast) #=> :void
1609
1717
  VeryLowLevel.Z3_optimize_assert(_ctx_pointer, optimize._optimize, ast._ast)
1610
1718
  end
1611
1719
 
1612
- def optimize_assert_soft(optimize, ast, str, sym) #=> :uint
1613
- VeryLowLevel.Z3_optimize_assert_soft(_ctx_pointer, optimize._optimize, ast._ast, str, sym)
1720
+ def optimize_assert_and_track(optimize, ast1, ast2) #=> :void
1721
+ VeryLowLevel.Z3_optimize_assert_and_track(_ctx_pointer, optimize._optimize, ast1._ast, ast2._ast)
1614
1722
  end
1615
1723
 
1616
- def optimize_check(optimize) #=> :int
1617
- VeryLowLevel.Z3_optimize_check(_ctx_pointer, optimize._optimize)
1724
+ def optimize_assert_soft(optimize, ast, str, sym) #=> :uint
1725
+ VeryLowLevel.Z3_optimize_assert_soft(_ctx_pointer, optimize._optimize, ast._ast, str, sym)
1618
1726
  end
1619
1727
 
1620
1728
  def optimize_dec_ref(optimize) #=> :void
@@ -1665,6 +1773,10 @@ module Z3
1665
1773
  VeryLowLevel.Z3_optimize_get_statistics(_ctx_pointer, optimize._optimize)
1666
1774
  end
1667
1775
 
1776
+ def optimize_get_unsat_core(optimize) #=> :ast_vector_pointer
1777
+ VeryLowLevel.Z3_optimize_get_unsat_core(_ctx_pointer, optimize._optimize)
1778
+ end
1779
+
1668
1780
  def optimize_get_upper(optimize, num) #=> :ast_pointer
1669
1781
  VeryLowLevel.Z3_optimize_get_upper(_ctx_pointer, optimize._optimize, num)
1670
1782
  end
@@ -1941,6 +2053,10 @@ module Z3
1941
2053
  VeryLowLevel.Z3_solver_check(_ctx_pointer, solver._solver)
1942
2054
  end
1943
2055
 
2056
+ def solver_cube(solver, ast_vector, num) #=> :ast_vector_pointer
2057
+ VeryLowLevel.Z3_solver_cube(_ctx_pointer, solver._solver, ast_vector, num)
2058
+ end
2059
+
1944
2060
  def solver_dec_ref(solver) #=> :void
1945
2061
  VeryLowLevel.Z3_solver_dec_ref(_ctx_pointer, solver._solver)
1946
2062
  end
@@ -1969,6 +2085,10 @@ module Z3
1969
2085
  VeryLowLevel.Z3_solver_get_model(_ctx_pointer, solver._solver)
1970
2086
  end
1971
2087
 
2088
+ def solver_get_non_units(solver) #=> :ast_vector_pointer
2089
+ VeryLowLevel.Z3_solver_get_non_units(_ctx_pointer, solver._solver)
2090
+ end
2091
+
1972
2092
  def solver_get_num_scopes(solver) #=> :uint
1973
2093
  VeryLowLevel.Z3_solver_get_num_scopes(_ctx_pointer, solver._solver)
1974
2094
  end
@@ -1989,18 +2109,38 @@ module Z3
1989
2109
  VeryLowLevel.Z3_solver_get_statistics(_ctx_pointer, solver._solver)
1990
2110
  end
1991
2111
 
2112
+ def solver_get_trail(solver) #=> :ast_vector_pointer
2113
+ VeryLowLevel.Z3_solver_get_trail(_ctx_pointer, solver._solver)
2114
+ end
2115
+
2116
+ def solver_get_units(solver) #=> :ast_vector_pointer
2117
+ VeryLowLevel.Z3_solver_get_units(_ctx_pointer, solver._solver)
2118
+ end
2119
+
1992
2120
  def solver_get_unsat_core(solver) #=> :ast_vector_pointer
1993
2121
  VeryLowLevel.Z3_solver_get_unsat_core(_ctx_pointer, solver._solver)
1994
2122
  end
1995
2123
 
2124
+ def solver_import_model_converter(solver1, solver2) #=> :void
2125
+ VeryLowLevel.Z3_solver_import_model_converter(_ctx_pointer, solver1._solver, solver2._solver)
2126
+ end
2127
+
1996
2128
  def solver_inc_ref(solver) #=> :void
1997
2129
  VeryLowLevel.Z3_solver_inc_ref(_ctx_pointer, solver._solver)
1998
2130
  end
1999
2131
 
2132
+ def solver_interrupt(solver) #=> :void
2133
+ VeryLowLevel.Z3_solver_interrupt(_ctx_pointer, solver._solver)
2134
+ end
2135
+
2000
2136
  def solver_pop(solver, num) #=> :void
2001
2137
  VeryLowLevel.Z3_solver_pop(_ctx_pointer, solver._solver, num)
2002
2138
  end
2003
2139
 
2140
+ def solver_propagate_register(solver, ast) #=> :uint
2141
+ VeryLowLevel.Z3_solver_propagate_register(_ctx_pointer, solver._solver, ast._ast)
2142
+ end
2143
+
2004
2144
  def solver_push(solver) #=> :void
2005
2145
  VeryLowLevel.Z3_solver_push(_ctx_pointer, solver._solver)
2006
2146
  end
@@ -2013,6 +2153,10 @@ module Z3
2013
2153
  VeryLowLevel.Z3_solver_set_params(_ctx_pointer, solver._solver, params._params)
2014
2154
  end
2015
2155
 
2156
+ def solver_to_dimacs_string(solver, bool) #=> :string
2157
+ VeryLowLevel.Z3_solver_to_dimacs_string(_ctx_pointer, solver._solver, bool)
2158
+ end
2159
+
2016
2160
  def solver_to_string(solver) #=> :string
2017
2161
  VeryLowLevel.Z3_solver_to_string(_ctx_pointer, solver._solver)
2018
2162
  end
data/lib/z3/optimize.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  module Z3
2
2
  class Optimize
3
3
  attr_reader :_optimize
4
+
4
5
  def initialize
5
6
  @_optimize = LowLevel.mk_optimize
6
7
  LowLevel.optimize_inc_ref(self)
@@ -27,9 +28,9 @@ module Z3
27
28
  LowLevel.optimize_assert_soft(self, ast)
28
29
  end
29
30
 
30
- def check
31
+ def check(*args)
31
32
  reset_model!
32
- result = check_sat_results(LowLevel.optimize_check(self))
33
+ result = check_sat_results(LowLevel.optimize_check(self, args))
33
34
  @has_model = true if result == :sat
34
35
  result
35
36
  end
@@ -81,7 +82,7 @@ module Z3
81
82
  case check
82
83
  when :sat
83
84
  puts "Counterexample exists"
84
- model.each do |n,v|
85
+ model.each do |n, v|
85
86
  puts "* #{n} = #{v}"
86
87
  end
87
88
  when :unknown
@@ -95,7 +96,6 @@ module Z3
95
96
  pop
96
97
  end
97
98
 
98
-
99
99
  def reason_unknown
100
100
  LowLevel.optimize_get_reason_unknown(self)
101
101
  end
@@ -1,19 +1,21 @@
1
1
  # Seriously do not use this directly in your code
2
-
3
- require 'ffi'
2
+ require "ffi"
4
3
 
5
4
  module Z3
6
5
  module VeryLowLevel
7
6
  extend FFI::Library
8
- ffi_lib "z3"
7
+ ffi_lib ["libz3.so.4.8", "libz3.so", "z3"]
9
8
 
10
9
  class << self
11
10
  # Aliases defined just to make APIs below look nicer
12
11
  def attach_function(name, arg_types, return_type)
13
-
14
- arg_types = arg_types.map{|t| map_type(t)}
12
+ arg_types = arg_types.map { |t| map_type(t) }
15
13
  return_type = map_type(return_type)
16
14
  super(name, arg_types, return_type)
15
+ rescue FFI::NotFoundError
16
+ define_singleton_method(name) do |*args|
17
+ raise Z3::Exception, "Could not find #{name} in the Z3 library. It is likely that the Z3 library has wrong version."
18
+ end
17
19
  end
18
20
 
19
21
  def map_type(t)
@@ -40,5 +42,6 @@ module Z3
40
42
  attach_function :Z3_mk_set_union, [:ctx_pointer, :int, :pointer], :ast_pointer
41
43
  attach_function :Z3_mk_set_intersect, [:ctx_pointer, :int, :pointer], :ast_pointer
42
44
  attach_function :Z3_mk_distinct, [:ctx_pointer, :int, :pointer], :ast_pointer
45
+ attach_function :Z3_optimize_check, [:ctx_pointer, :optimize_pointer, :int, :pointer], :int
43
46
  end
44
47
  end