z3 0.0.20160221 → 0.0.20160323

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -1
  3. data/examples/algebra_problems +24 -24
  4. data/examples/basic_int_math +8 -8
  5. data/examples/basic_logic +8 -8
  6. data/examples/bit_tricks +161 -0
  7. data/examples/bridges_solver +1 -1
  8. data/examples/clogic_puzzle_solver +135 -0
  9. data/examples/four_hackers_puzzle +194 -0
  10. data/examples/geometry_problem +11 -11
  11. data/examples/kakuro_solver +3 -3
  12. data/examples/kinematics_problems +37 -37
  13. data/examples/letter_connections_solver +11 -11
  14. data/examples/light_up_solver +5 -5
  15. data/examples/minisudoku_solver +4 -4
  16. data/examples/selfref_solver +35 -35
  17. data/examples/sudoku_solver +4 -4
  18. data/examples/verbal_arithmetic +2 -2
  19. data/lib/z3/exception.rb +25 -0
  20. data/lib/z3/func_decl.rb +7 -7
  21. data/lib/z3/interface.rb +255 -0
  22. data/lib/z3/low_level.rb +4 -6
  23. data/lib/z3/low_level_auto.rb +1551 -1547
  24. data/lib/z3/model.rb +3 -2
  25. data/lib/z3/solver.rb +65 -54
  26. data/lib/z3/sort/bitvec_sort.rb +40 -0
  27. data/lib/z3/sort/bool_sort.rb +31 -0
  28. data/lib/z3/sort/int_sort.rb +21 -0
  29. data/lib/z3/sort/real_sort.rb +36 -0
  30. data/lib/z3/sort/sort.rb +76 -0
  31. data/lib/z3/value/arith_value.rb +53 -0
  32. data/lib/z3/value/bitvec_value.rb +67 -0
  33. data/lib/z3/value/bool_value.rb +29 -0
  34. data/lib/z3/value/int_value.rb +7 -0
  35. data/lib/z3/value/real_value.rb +7 -0
  36. data/lib/z3/value/value.rb +48 -0
  37. data/lib/z3/very_low_level.rb +28 -45
  38. data/lib/z3/very_low_level_auto.rb +518 -516
  39. data/lib/z3.rb +23 -33
  40. data/spec/integration/bit_tricks_spec.rb +21 -0
  41. data/spec/model_spec.rb +9 -9
  42. data/spec/solver_spec.rb +2 -2
  43. data/spec/sort_spec.rb +38 -13
  44. data/spec/{ast_spec.rb → value_spec.rb} +60 -57
  45. metadata +21 -6
  46. data/lib/z3/ast.rb +0 -302
  47. data/lib/z3/sort.rb +0 -33
  48. /data/spec/integration/{bagic_int_math_spec.rb → basic_int_math_spec.rb} +0 -0
@@ -6,7 +6,7 @@ class VerbalArithmetic
6
6
  def initialize(a, b, c)
7
7
  @solver = Z3::Solver.new
8
8
  @vars = Hash.new do |ht,name|
9
- v = Z3::Ast.int(name)
9
+ v = Z3.Int(name)
10
10
  @solver.assert v >= 0
11
11
  @solver.assert v <= 9
12
12
  ht[name] = v
@@ -21,7 +21,7 @@ class VerbalArithmetic
21
21
  @solver.assert @b[0] != 0
22
22
  @solver.assert @c[0] != 0
23
23
  @solver.assert word_value(@a) + word_value(@b) == word_value(@c)
24
- @solver.assert Z3::Ast.distinct(*@vars.values)
24
+ @solver.assert Z3.Distinct(*@vars.values)
25
25
 
26
26
  if @solver.check == :sat
27
27
  @model = @solver.model
@@ -0,0 +1,25 @@
1
+ module Z3
2
+ class Exception < StandardError
3
+ end
4
+
5
+
6
+ Z3::LowLevel.set_error_handler do |ctx, error|
7
+ error_codes_enum = %W[
8
+ Z3_OK
9
+ Z3_SORT_ERROR
10
+ Z3_IOB
11
+ Z3_INVALID_ARG
12
+ Z3_PARSER_ERROR
13
+ Z3_NO_PARSER
14
+ Z3_INVALID_PATTERN
15
+ Z3_MEMOUT_FAIL
16
+ Z3_FILE_ACCESS_ERROR
17
+ Z3_INTERNAL_FATAL
18
+ Z3_INVALID_USAGE
19
+ Z3_DEC_REF_ERROR
20
+ Z3_EXCEPTION
21
+ ]
22
+ error = error_codes_enum[error] || error
23
+ raise Z3::Exception, "Z3 library failed with error #{error}"
24
+ end
25
+ end
data/lib/z3/func_decl.rb CHANGED
@@ -12,14 +12,14 @@ class Z3::FuncDecl
12
12
  Z3::LowLevel.get_arity(self)
13
13
  end
14
14
 
15
- def to_ast
16
- Z3::Ast.new(Z3::LowLevel.func_decl_to_ast(self))
17
- end
15
+ # def to_ast
16
+ # Z3::Ast.new(Z3::LowLevel.func_decl_to_ast(self))
17
+ # end
18
18
 
19
- def ast_parameter(i)
20
- # vs arity ?
21
- Z3::Ast.new(Z3::LowLevel.get_decl_ast_parameter(self, i))
22
- end
19
+ # def ast_parameter(i)
20
+ # # vs arity ?
21
+ # Z3::Ast.new(Z3::LowLevel.get_decl_ast_parameter(self, i))
22
+ # end
23
23
 
24
24
  def to_s
25
25
  name
@@ -0,0 +1,255 @@
1
+ module Z3
2
+ def Int(v)
3
+ IntSort.new.var(v)
4
+ end
5
+
6
+ def Real(v)
7
+ RealSort.new.var(v)
8
+ end
9
+
10
+ def Bool(v)
11
+ BoolSort.new.var(v)
12
+ end
13
+
14
+ def Bitvec(v, n)
15
+ BitvecSort.new(n).var(v)
16
+ end
17
+
18
+ def True
19
+ BoolSort.new.True
20
+ end
21
+
22
+ def False
23
+ BoolSort.new.False
24
+ end
25
+
26
+ def And(*args)
27
+ args = coerce_to_same_sort(*args)
28
+ case args[0]
29
+ when BoolValue
30
+ BoolSort.new.new(Z3::LowLevel.mk_and(args))
31
+ when BitvecValue
32
+ args.inject do |a,b|
33
+ a.sort.new(Z3::LowLevel.mk_bvand(a, b))
34
+ end
35
+ else
36
+ raise ArgumentError, "Can't perform logic operations on #{a.sort} values, only Bool and Bitvec"
37
+ end
38
+ end
39
+
40
+ def Or(*args)
41
+ args = coerce_to_same_sort(*args)
42
+ case args[0]
43
+ when BoolValue
44
+ BoolSort.new.new(Z3::LowLevel.mk_or(args))
45
+ when BitvecValue
46
+ args.inject do |a,b|
47
+ a.sort.new(Z3::LowLevel.mk_bvor(a, b))
48
+ end
49
+ else
50
+ raise ArgumentError, "Can't perform logic operations on #{a.sort} values, only Bool and Bitvec"
51
+ end
52
+ end
53
+
54
+ def Xor(*args)
55
+ args = coerce_to_same_sort(*args)
56
+ case args[0]
57
+ when BoolValue
58
+ BoolSort.new.new(Z3::LowLevel.mk_xor(args))
59
+ when BitvecValue
60
+ args.inject do |a,b|
61
+ a.sort.new(Z3::LowLevel.mk_bvxor(a, b))
62
+ end
63
+ else
64
+ raise ArgumentError, "Can't perform logic operations on #{a.sort} values, only Bool and Bitvec"
65
+ end
66
+ end
67
+
68
+ def Implies(a,b)
69
+ a, b = coerce_to_same_bool_sort(a, b)
70
+ BoolSort.new.new(Z3::LowLevel.mk_implies(a, b))
71
+ end
72
+
73
+ def Iff(a,b)
74
+ a, b = coerce_to_same_bool_sort(a, b)
75
+ BoolSort.new.new(Z3::LowLevel.mk_iff(a, b))
76
+ end
77
+
78
+ def Add(*args)
79
+ raise ArgumentError if args.empty?
80
+ args = coerce_to_same_sort(*args)
81
+ case args[0]
82
+ when ArithValue
83
+ args[0].sort.new(LowLevel.mk_add(args))
84
+ when BitvecValue
85
+ args.inject do |a,b|
86
+ a.sort.new(LowLevel.mk_bvadd(a,b))
87
+ end
88
+ else
89
+ raise ArgumentError, "Can't perform logic operations on #{args[0].sort} values, only Int/Real/Bitvec"
90
+ end
91
+ end
92
+
93
+ def Sub(*args)
94
+ args = coerce_to_same_sort(*args)
95
+ case args[0]
96
+ when ArithValue
97
+ args[0].sort.new(LowLevel.mk_sub(args))
98
+ when BitvecValue
99
+ args.inject do |a,b|
100
+ a.sort.new(LowLevel.mk_bvsub(a,b))
101
+ end
102
+ else
103
+ raise ArgumentError, "Can't perform logic operations on #{args[0].sort} values, only Int/Real/Bitvec"
104
+ end
105
+ end
106
+
107
+ def Mul(*args)
108
+ args = coerce_to_same_sort(*args)
109
+ case args[0]
110
+ when ArithValue
111
+ args[0].sort.new(LowLevel.mk_mul(args))
112
+ when BitvecValue
113
+ args.inject do |a,b|
114
+ a.sort.new(LowLevel.mk_bvmul(a,b))
115
+ end
116
+ else
117
+ raise ArgumentError, "Can't perform logic operations on #{args[0].sort} values, only Int/Real/Bitvec"
118
+ end
119
+ end
120
+
121
+ def Div(a,b)
122
+ a, b = coerce_to_same_arith_sort(a, b)
123
+ a.sort.new(LowLevel.mk_div(a, b))
124
+ end
125
+
126
+ def Power(a, b)
127
+ # Wait, is this even legitimate that it's I**I and R**R?
128
+ a, b = coerce_to_same_arith_sort(a, b)
129
+ a.sort.new(LowLevel.mk_power(a, b))
130
+ end
131
+
132
+ def Eq(a, b)
133
+ a, b = coerce_to_same_sort(a, b)
134
+ BoolSort.new.new(LowLevel.mk_eq(a, b))
135
+ end
136
+
137
+ def Distinct(*args)
138
+ args = coerce_to_same_sort(*args)
139
+ BoolSort.new.new(LowLevel.mk_distinct(args))
140
+ end
141
+
142
+ def Gt(a, b)
143
+ a, b = coerce_to_same_sort(a, b)
144
+ case a
145
+ when ArithValue
146
+ BoolSort.new.new(LowLevel.mk_gt(a, b))
147
+ when BitvecValue
148
+ BoolSort.new.new(LowLevel.mk_bvsgt(a, b))
149
+ else
150
+ raise ArgumentError, "Can't compare #{a.sort} values"
151
+ end
152
+ end
153
+
154
+ def Ge(a, b)
155
+ a, b = coerce_to_same_sort(a, b)
156
+ case a
157
+ when ArithValue
158
+ BoolSort.new.new(LowLevel.mk_ge(a, b))
159
+ when BitvecValue
160
+ BoolSort.new.new(LowLevel.mk_bvsge(a, b))
161
+ else
162
+ raise ArgumentError, "Can't compare #{a.sort} values"
163
+ end
164
+ end
165
+
166
+ def Lt(a, b)
167
+ a, b = coerce_to_same_sort(a, b)
168
+ case a
169
+ when ArithValue
170
+ BoolSort.new.new(LowLevel.mk_lt(a, b))
171
+ when BitvecValue
172
+ BoolSort.new.new(LowLevel.mk_bvslt(a, b))
173
+ else
174
+ raise ArgumentError, "Can't compare #{a.sort} values"
175
+ end
176
+ end
177
+
178
+ def Le(a, b)
179
+ a, b = coerce_to_same_sort(a, b)
180
+ case a
181
+ when ArithValue
182
+ BoolSort.new.new(LowLevel.mk_le(a, b))
183
+ when BitvecValue
184
+ BoolSort.new.new(LowLevel.mk_bvsle(a, b))
185
+ else
186
+ raise ArgumentError, "Can't compare #{a.sort} values"
187
+ end
188
+ end
189
+
190
+ def Not(a)
191
+ a = Value.from_const(a) unless a.is_a?(Value)
192
+ raise Z3::Exception, "No idea how to autoconvert `#{a.class}': `#{a.inspect}'" unless a.is_a?(BoolValue)
193
+ BoolSort.new.new(LowLevel.mk_not(a))
194
+ end
195
+
196
+ # Presume arithmetic (sign-extend)
197
+ def RShift(a, b)
198
+ a, b = coerce_to_same_bv_sort(a, b)
199
+ a.sort.new(LowLevel.mk_bvashr(a, b))
200
+ end
201
+
202
+ def LShift(a, b)
203
+ a, b = coerce_to_same_bv_sort(a, b)
204
+ a.sort.new(LowLevel.mk_bvshl(a, b))
205
+ end
206
+
207
+ def version
208
+ LowLevel.get_version.join(".")
209
+ end
210
+
211
+ def set_param(k,v)
212
+ LowLevel.global_param_set(k,v)
213
+ end
214
+
215
+ private
216
+
217
+ def coerce_to_same_sort(*args)
218
+ # This will raise exception unless one of the sorts is highest
219
+ # So [true, IntSort]
220
+ max_sort = args.map{|a| a.is_a?(Value) ? a.sort : Value.sort_for_const(a)}.max
221
+ args.map do |a|
222
+ if a.is_a?(Value)
223
+ if a.sort == max_sort
224
+ a
225
+ else
226
+ max_sort.from_value(a)
227
+ end
228
+ else
229
+ max_sort.from_const(a)
230
+ end
231
+ end
232
+ end
233
+
234
+ def coerce_to_same_bool_sort(*args)
235
+ args = coerce_to_same_sort(*args)
236
+ raise Z3::Exception, "Bool value expected" unless args[0].is_a?(BoolValue)
237
+ args
238
+ end
239
+
240
+ def coerce_to_same_arith_sort(*args)
241
+ args = coerce_to_same_sort(*args)
242
+ raise Z3::Exception, "Int or Real value expected" unless args[0].is_a?(IntValue) or args[0].is_a?(RealValue)
243
+ args
244
+ end
245
+
246
+ def coerce_to_same_bv_sort(*args)
247
+ args = coerce_to_same_sort(*args)
248
+ raise Z3::Exception, "Bitvec value with same nize expected" unless args[0].is_a?(BitvecValue)
249
+ args
250
+ end
251
+
252
+ class << self
253
+ include Z3
254
+ end
255
+ end
data/lib/z3/low_level.rb CHANGED
@@ -54,8 +54,10 @@ module Z3::LowLevel
54
54
  Z3::VeryLowLevel.Z3_mk_distinct(_ctx_pointer, asts.size, asts_vector(asts))
55
55
  end
56
56
 
57
- ### Automatically generated, do not edit that file
58
- eval open("#{__dir__}/low_level_auto.rb").read
57
+ # Should be private
58
+ def _ctx_pointer
59
+ @_ctx_pointer ||= Z3::Context.instance._context
60
+ end
59
61
 
60
62
  private
61
63
 
@@ -65,9 +67,5 @@ module Z3::LowLevel
65
67
  c_args.write_array_of_pointer args.map(&:_ast)
66
68
  c_args
67
69
  end
68
-
69
- def _ctx_pointer
70
- @_ctx_pointer ||= Z3::Context.instance._context
71
- end
72
70
  end
73
71
  end