z3 0.0.20180629 → 0.0.20181126

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: 9b62645ba88a89cc0c81a5f2088f4b919953d778d99f52af3798cd6b9f130e61
4
- data.tar.gz: 97269d402d845d9192c558c271c2448cdc420d3c93d6bf2f3e2afb0238b039cc
3
+ metadata.gz: 4c93f27f8597c24344b97bcb79677cb1c91d92d626e457600ab36e355db41586
4
+ data.tar.gz: a85deb034bee0faeb6a6c4283e85657cf394ae7ec2643b91f4d8d249ac337748
5
5
  SHA512:
6
- metadata.gz: 2bc073a01310b704b5e64d5d6bd26f31b1b061e38f9d9edb3a0fed0e2e2db2989fbac863c35c7213d5f81ba0a74ec2d95c16c440ad8d0550d5ce842d1b843c64
7
- data.tar.gz: 390f2516225de2bf7887ed42597587e53f3ec0c3ebe89d85c2aa43c54717e4dee3cb485c5d62199c94467866c776491de4ea758fec6f1b80f32689b577da7cb7
6
+ metadata.gz: 34781021336dab28fe7969b707638461bd8da2bb1b331038ca10e0c7eb015582c478360f0264c2174b517807e99bbf7598431dd985b39b3d0472fea8b550d23f
7
+ data.tar.gz: e382c7d4caa935adda0172436e4d3f7e6499dd46c4dcb0f2a95ee641ac1487c2bb06035a7fe6c6d40f35a1d9d664a3948cd26fac856d890833f0ec8c85eb6b71
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  This is Ruby interface for Z3 [ https://github.com/Z3Prover/z3 ].
2
2
 
3
- Minimum required version is Z3 4.6.
3
+ Minimum required version is Z3 4.8.
4
4
 
5
5
  It's in very early stages of development. Pull requests always welcome.
6
6
 
data/Rakefile CHANGED
@@ -7,43 +7,43 @@ task "test:unit" => "spec:unit"
7
7
 
8
8
  desc "Regenerate API"
9
9
  task "api" do
10
- system "./api/gen_api api/definitions.h"
10
+ sh "./api/gen_api api/definitions.h"
11
11
  end
12
12
 
13
13
  desc "Clean up"
14
14
  task "clean" do
15
- system "trash z3-*.gem coverage"
15
+ sh "trash z3-*.gem coverage"
16
16
  end
17
17
 
18
18
  desc "Run tests"
19
19
  task "spec" do
20
- system "rspec"
20
+ sh "rspec"
21
21
  end
22
22
 
23
23
  desc "Run unit tests"
24
24
  task "spec:unit" do
25
- system "rspec spec/*_spec.rb"
25
+ sh "rspec spec/*_spec.rb"
26
26
  end
27
27
 
28
28
  desc "Run integration tests"
29
29
  task "spec:integration" do
30
- system "rspec spec/integration/*_spec.rb"
30
+ sh "rspec spec/integration/*_spec.rb"
31
31
  end
32
32
 
33
33
  desc "Build gem"
34
34
  task "gem:build" do
35
- system "gem build z3.gemspec"
35
+ sh "gem build z3.gemspec"
36
36
  end
37
37
 
38
38
  desc "Upload gem"
39
39
  task "gem:push" => "gem:build" do
40
40
  gem_file = Dir["z3-*.gem"][-1] or raise "No gem found"
41
- system "gem", "push", gem_file
41
+ sh "gem", "push", gem_file
42
42
  end
43
43
 
44
44
  desc "Report missing APIs"
45
45
  task "coverage:missing" do
46
- system "COVERAGE=1 rake test"
46
+ sh "COVERAGE=1 rake test"
47
47
  data = JSON.load(open("coverage/.resultset.json"))["RSpec"]["coverage"]
48
48
  lla_path = data.keys.find{|k| k.end_with?("lib/z3/low_level_auto.rb")}
49
49
  coverage = data[lla_path].zip(File.readlines(lla_path).map(&:strip))
@@ -53,4 +53,4 @@ task "coverage:missing" do
53
53
  open("missing_apis.txt", "w") do |file|
54
54
  file.puts missing
55
55
  end
56
- end
56
+ end
@@ -15,7 +15,7 @@ class SimpleRegexpParser
15
15
  end
16
16
 
17
17
  def sequence(*parts)
18
- parts = parts.select{|x| x[0] != :empty}
18
+ parts = parts.select { |x| x[0] != :empty }
19
19
  case parts.size
20
20
  when 0
21
21
  [:empty]
@@ -46,9 +46,9 @@ class SimpleRegexpParser
46
46
  # Saves us time to reuse ruby regexp engine for 1 character case
47
47
  def character_type(char_rx)
48
48
  char_rx = Regexp.new(char_rx)
49
- codes = (0..127).select{|c| c.chr =~ char_rx}
49
+ codes = (0..127).select { |c| c.chr =~ char_rx }
50
50
  # This is mostly here to make debugging easier
51
- if codes.size > 127-codes.size
51
+ if codes.size > 127 - codes.size
52
52
  [:neg_set, (0..127).to_a - codes]
53
53
  else
54
54
  [:set, codes]
@@ -64,7 +64,7 @@ class SimpleRegexpParser
64
64
  end
65
65
 
66
66
  def literal(chars)
67
- sequence(*chars.map{|c| character_type(c)})
67
+ sequence(*chars.map { |c| character_type(c) })
68
68
  end
69
69
 
70
70
  def star(part)
@@ -85,10 +85,10 @@ class SimpleRegexpParser
85
85
 
86
86
  def repeat(part, min, max)
87
87
  if max == -1
88
- sequence(star(part), *([part]*min))
88
+ sequence(star(part), *([part] * min))
89
89
  else
90
90
  maybe_part = alternative([:empty], part)
91
- sequence(*([part]*min), *([maybe_part] * (max-min)))
91
+ sequence(*([part] * min), *([maybe_part] * (max - min)))
92
92
  end
93
93
  end
94
94
 
@@ -105,7 +105,7 @@ class SimpleRegexpParser
105
105
  sequence(repeat(base, min, max), part)
106
106
  )
107
107
  else # (a){2,} -> a{1,}(a)
108
- sequence(repeat(base, min-1, max), part)
108
+ sequence(repeat(base, min - 1, max), part)
109
109
  end
110
110
  elsif max == 0 # a{0} -> empty, not really a thing
111
111
  :empty
@@ -115,10 +115,10 @@ class SimpleRegexpParser
115
115
  # with same group id for both ()s
116
116
  alternative(
117
117
  [:group, group, empty],
118
- sequence(repeat(base, min, max-1), part)
118
+ sequence(repeat(base, min, max - 1), part)
119
119
  )
120
120
  else # (a){2,3} -> a{1,2}(a)
121
- sequence(repeat(base, min-1, max-1), part)
121
+ sequence(repeat(base, min - 1, max - 1), part)
122
122
  end
123
123
  end
124
124
  end
@@ -131,58 +131,60 @@ class SimpleRegexpParser
131
131
  # * empty
132
132
  # * backref - \1
133
133
  # * group - (a)
134
- def parse(node=@tree)
134
+ def parse(node = @tree)
135
135
  result = case node
136
- when Regexp::Expression::Group::Capture
137
- # Assumes it's going to be parsed in right order
138
- group(new_group, sequence(*node.expressions.map{|n| parse(n)}))
139
- when Regexp::Expression::Alternation
140
- alternative(*node.expressions.map{|n| parse(n)})
141
- when Regexp::Expression::Assertion::Lookahead
142
- [:anchor, :lookahead, sequence(*node.expressions.map{|n| parse(n)})]
143
- when Regexp::Expression::Assertion::NegativeLookahead
144
- [:anchor, :negative_lookahead, sequence(*node.expressions.map{|n| parse(n)})]
145
- when Regexp::Expression::Assertion::Lookbehind
146
- [:anchor, :lookbehind, sequence(*node.expressions.map{|n| parse(n)})]
147
- when Regexp::Expression::Assertion::NegativeLookbehind
148
- [:anchor, :negative_lookbehind, sequence(*node.expressions.map{|n| parse(n)})]
149
- when Regexp::Expression::Subexpression
150
- # It's annoyingly subtypes a lot
151
- raise unless node.class == Regexp::Expression::Subexpression or
152
- node.class == Regexp::Expression::Group::Passive or
153
- node.class == Regexp::Expression::Root or
154
- node.class == Regexp::Expression::Alternative
155
- sequence(*node.expressions.map{|n| parse(n)})
156
- when Regexp::Expression::CharacterSet
157
- character_set(node.negative?, node.members)
158
- when Regexp::Expression::Literal
159
- literal(node.text.chars)
160
- when Regexp::Expression::CharacterType::Base
161
- character_type(node.text)
162
- when Regexp::Expression::EscapeSequence::Base
163
- character_type(node.text)
164
- when Regexp::Expression::Backreference::Number
165
- num = node.text[%r[\A\\(\d+)\z], 1] or raise "Parse error"
166
- backref(num.to_i)
167
- when Regexp::Expression::Anchor::BeginningOfString
168
- [:anchor, :bos]
169
- when Regexp::Expression::Anchor::EndOfString
170
- [:anchor, :eos]
171
- when Regexp::Expression::Anchor::BeginningOfLine
172
- [:anchor, :bol]
173
- when Regexp::Expression::Anchor::EndOfLine
174
- [:anchor, :eol]
175
- else
176
- raise "Unknown expression"
177
- end
136
+ when Regexp::Expression::Group::Capture
137
+ # Assumes it's going to be parsed in right order
138
+ group(new_group, sequence(*node.expressions.map { |n| parse(n) }))
139
+ when Regexp::Expression::Alternation
140
+ alternative(*node.expressions.map { |n| parse(n) })
141
+ when Regexp::Expression::Assertion::Lookahead
142
+ [:anchor, :lookahead, sequence(*node.expressions.map { |n| parse(n) })]
143
+ when Regexp::Expression::Assertion::NegativeLookahead
144
+ [:anchor, :negative_lookahead, sequence(*node.expressions.map { |n| parse(n) })]
145
+ when Regexp::Expression::Assertion::Lookbehind
146
+ [:anchor, :lookbehind, sequence(*node.expressions.map { |n| parse(n) })]
147
+ when Regexp::Expression::Assertion::NegativeLookbehind
148
+ [:anchor, :negative_lookbehind, sequence(*node.expressions.map { |n| parse(n) })]
149
+ when Regexp::Expression::CharacterSet
150
+ character_set(node.negative?, node.expressions)
151
+ when Regexp::Expression::Subexpression
152
+ # It's annoyingly subtypes a lot
153
+ unless (node.class == Regexp::Expression::Subexpression or
154
+ node.class == Regexp::Expression::Group::Passive or
155
+ node.class == Regexp::Expression::Root or
156
+ node.class == Regexp::Expression::Alternative)
157
+ raise "Don't know how to deal with #{node.class}"
158
+ end
159
+ sequence(*node.expressions.map { |n| parse(n) })
160
+ when Regexp::Expression::Literal
161
+ literal(node.text.chars)
162
+ when Regexp::Expression::CharacterType::Base
163
+ character_type(node.text)
164
+ when Regexp::Expression::EscapeSequence::Base
165
+ character_type(node.text)
166
+ when Regexp::Expression::Backreference::Number
167
+ num = node.text[%r[\A\\(\d+)\z], 1] or raise "Parse error"
168
+ backref(num.to_i)
169
+ when Regexp::Expression::Anchor::BeginningOfString
170
+ [:anchor, :bos]
171
+ when Regexp::Expression::Anchor::EndOfString
172
+ [:anchor, :eos]
173
+ when Regexp::Expression::Anchor::BeginningOfLine
174
+ [:anchor, :bol]
175
+ when Regexp::Expression::Anchor::EndOfLine
176
+ [:anchor, :eol]
177
+ else
178
+ raise "Unknown expression"
179
+ end
178
180
  if node.quantified?
179
181
  min = node.quantifier.min
180
182
  max = node.quantifier.max
181
183
  result = if result[0] == :group
182
- repeat_group(result, min, max)
183
- else
184
- repeat(result, min, max)
185
- end
184
+ repeat_group(result, min, max)
185
+ else
186
+ repeat(result, min, max)
187
+ end
186
188
  end
187
189
 
188
190
  result
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,7 +111,7 @@ 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
@@ -124,7 +125,7 @@ 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
@@ -136,11 +137,11 @@ 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
@@ -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
@@ -77,10 +77,6 @@ module Z3
77
77
  VeryLowLevel.Z3_algebraic_sub(_ctx_pointer, ast1._ast, ast2._ast)
78
78
  end
79
79
 
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
80
  def apply_result_dec_ref(apply_result) #=> :void
85
81
  VeryLowLevel.Z3_apply_result_dec_ref(_ctx_pointer, apply_result._apply_result)
86
82
  end
@@ -213,6 +209,10 @@ module Z3
213
209
  VeryLowLevel.Z3_enable_trace(str)
214
210
  end
215
211
 
212
+ def eval_smtlib2_string(str) #=> :string
213
+ VeryLowLevel.Z3_eval_smtlib2_string(_ctx_pointer, str)
214
+ end
215
+
216
216
  def finalize_memory #=> :void
217
217
  VeryLowLevel.Z3_finalize_memory()
218
218
  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
@@ -605,10 +601,6 @@ module Z3
605
601
  VeryLowLevel.Z3_get_numerator(_ctx_pointer, ast._ast)
606
602
  end
607
603
 
608
- def get_parser_error #=> :string
609
- VeryLowLevel.Z3_get_parser_error(_ctx_pointer)
610
- end
611
-
612
604
  def get_pattern(pattern, num) #=> :ast_pointer
613
605
  VeryLowLevel.Z3_get_pattern(_ctx_pointer, pattern._ast, num)
614
606
  end
@@ -725,6 +717,10 @@ module Z3
725
717
  VeryLowLevel.Z3_goal_assert(_ctx_pointer, goal._goal, ast._ast)
726
718
  end
727
719
 
720
+ def goal_convert_model(goal, model) #=> :model_pointer
721
+ VeryLowLevel.Z3_goal_convert_model(_ctx_pointer, goal._goal, model._model)
722
+ end
723
+
728
724
  def goal_dec_ref(goal) #=> :void
729
725
  VeryLowLevel.Z3_goal_dec_ref(_ctx_pointer, goal._goal)
730
726
  end
@@ -769,6 +765,10 @@ module Z3
769
765
  VeryLowLevel.Z3_goal_size(_ctx_pointer, goal._goal)
770
766
  end
771
767
 
768
+ def goal_to_dimacs_string(goal) #=> :string
769
+ VeryLowLevel.Z3_goal_to_dimacs_string(_ctx_pointer, goal._goal)
770
+ end
771
+
772
772
  def goal_to_string(goal) #=> :string
773
773
  VeryLowLevel.Z3_goal_to_string(_ctx_pointer, goal._goal)
774
774
  end
@@ -781,10 +781,6 @@ module Z3
781
781
  VeryLowLevel.Z3_inc_ref(_ctx_pointer, ast._ast)
782
782
  end
783
783
 
784
- def interpolation_profile #=> :string
785
- VeryLowLevel.Z3_interpolation_profile(_ctx_pointer)
786
- end
787
-
788
784
  def interrupt #=> :void
789
785
  VeryLowLevel.Z3_interrupt(_ctx_pointer)
790
786
  end
@@ -813,10 +809,18 @@ module Z3
813
809
  VeryLowLevel.Z3_is_eq_sort(_ctx_pointer, sort1._ast, sort2._ast)
814
810
  end
815
811
 
812
+ def is_lambda(ast) #=> :bool
813
+ VeryLowLevel.Z3_is_lambda(_ctx_pointer, ast._ast)
814
+ end
815
+
816
816
  def is_numeral_ast(ast) #=> :bool
817
817
  VeryLowLevel.Z3_is_numeral_ast(_ctx_pointer, ast._ast)
818
818
  end
819
819
 
820
+ def is_quantifier_exists(ast) #=> :bool
821
+ VeryLowLevel.Z3_is_quantifier_exists(_ctx_pointer, ast._ast)
822
+ end
823
+
820
824
  def is_quantifier_forall(ast) #=> :bool
821
825
  VeryLowLevel.Z3_is_quantifier_forall(_ctx_pointer, ast._ast)
822
826
  end
@@ -1349,14 +1353,6 @@ module Z3
1349
1353
  VeryLowLevel.Z3_mk_int_to_str(_ctx_pointer, ast._ast)
1350
1354
  end
1351
1355
 
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
1356
  def mk_is_int(ast) #=> :ast_pointer
1361
1357
  VeryLowLevel.Z3_mk_is_int(_ctx_pointer, ast._ast)
1362
1358
  end
@@ -1605,6 +1601,10 @@ module Z3
1605
1601
  VeryLowLevel.Z3_model_to_string(_ctx_pointer, model._model)
1606
1602
  end
1607
1603
 
1604
+ def model_translate(model, context) #=> :model_pointer
1605
+ VeryLowLevel.Z3_model_translate(_ctx_pointer, model._model, context._context)
1606
+ end
1607
+
1608
1608
  def optimize_assert(optimize, ast) #=> :void
1609
1609
  VeryLowLevel.Z3_optimize_assert(_ctx_pointer, optimize._optimize, ast._ast)
1610
1610
  end
@@ -1613,10 +1613,6 @@ module Z3
1613
1613
  VeryLowLevel.Z3_optimize_assert_soft(_ctx_pointer, optimize._optimize, ast._ast, str, sym)
1614
1614
  end
1615
1615
 
1616
- def optimize_check(optimize) #=> :int
1617
- VeryLowLevel.Z3_optimize_check(_ctx_pointer, optimize._optimize)
1618
- end
1619
-
1620
1616
  def optimize_dec_ref(optimize) #=> :void
1621
1617
  VeryLowLevel.Z3_optimize_dec_ref(_ctx_pointer, optimize._optimize)
1622
1618
  end
@@ -1665,6 +1661,10 @@ module Z3
1665
1661
  VeryLowLevel.Z3_optimize_get_statistics(_ctx_pointer, optimize._optimize)
1666
1662
  end
1667
1663
 
1664
+ def optimize_get_unsat_core(optimize) #=> :ast_vector_pointer
1665
+ VeryLowLevel.Z3_optimize_get_unsat_core(_ctx_pointer, optimize._optimize)
1666
+ end
1667
+
1668
1668
  def optimize_get_upper(optimize, num) #=> :ast_pointer
1669
1669
  VeryLowLevel.Z3_optimize_get_upper(_ctx_pointer, optimize._optimize, num)
1670
1670
  end
@@ -1941,6 +1941,10 @@ module Z3
1941
1941
  VeryLowLevel.Z3_solver_check(_ctx_pointer, solver._solver)
1942
1942
  end
1943
1943
 
1944
+ def solver_cube(solver, ast_vector, num) #=> :ast_vector_pointer
1945
+ VeryLowLevel.Z3_solver_cube(_ctx_pointer, solver._solver, ast_vector, num)
1946
+ end
1947
+
1944
1948
  def solver_dec_ref(solver) #=> :void
1945
1949
  VeryLowLevel.Z3_solver_dec_ref(_ctx_pointer, solver._solver)
1946
1950
  end
@@ -1969,6 +1973,10 @@ module Z3
1969
1973
  VeryLowLevel.Z3_solver_get_model(_ctx_pointer, solver._solver)
1970
1974
  end
1971
1975
 
1976
+ def solver_get_non_units(solver) #=> :ast_vector_pointer
1977
+ VeryLowLevel.Z3_solver_get_non_units(_ctx_pointer, solver._solver)
1978
+ end
1979
+
1972
1980
  def solver_get_num_scopes(solver) #=> :uint
1973
1981
  VeryLowLevel.Z3_solver_get_num_scopes(_ctx_pointer, solver._solver)
1974
1982
  end
@@ -1989,10 +1997,18 @@ module Z3
1989
1997
  VeryLowLevel.Z3_solver_get_statistics(_ctx_pointer, solver._solver)
1990
1998
  end
1991
1999
 
2000
+ def solver_get_units(solver) #=> :ast_vector_pointer
2001
+ VeryLowLevel.Z3_solver_get_units(_ctx_pointer, solver._solver)
2002
+ end
2003
+
1992
2004
  def solver_get_unsat_core(solver) #=> :ast_vector_pointer
1993
2005
  VeryLowLevel.Z3_solver_get_unsat_core(_ctx_pointer, solver._solver)
1994
2006
  end
1995
2007
 
2008
+ def solver_import_model_converter(solver1, solver2) #=> :void
2009
+ VeryLowLevel.Z3_solver_import_model_converter(_ctx_pointer, solver1._solver, solver2._solver)
2010
+ end
2011
+
1996
2012
  def solver_inc_ref(solver) #=> :void
1997
2013
  VeryLowLevel.Z3_solver_inc_ref(_ctx_pointer, solver._solver)
1998
2014
  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,6 +1,5 @@
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
@@ -10,8 +9,7 @@ module Z3
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)
17
15
  end
@@ -40,5 +38,6 @@ module Z3
40
38
  attach_function :Z3_mk_set_union, [:ctx_pointer, :int, :pointer], :ast_pointer
41
39
  attach_function :Z3_mk_set_intersect, [:ctx_pointer, :int, :pointer], :ast_pointer
42
40
  attach_function :Z3_mk_distinct, [:ctx_pointer, :int, :pointer], :ast_pointer
41
+ attach_function :Z3_optimize_check, [:ctx_pointer, :optimize_pointer, :int, :pointer], :int
43
42
  end
44
43
  end
@@ -19,7 +19,6 @@ module Z3
19
19
  attach_function :Z3_algebraic_root, [:ctx_pointer, :ast_pointer, :uint], :ast_pointer
20
20
  attach_function :Z3_algebraic_sign, [:ctx_pointer, :ast_pointer], :int
21
21
  attach_function :Z3_algebraic_sub, [:ctx_pointer, :ast_pointer, :ast_pointer], :ast_pointer
22
- attach_function :Z3_apply_result_convert_model, [:ctx_pointer, :apply_result_pointer, :uint, :model_pointer], :model_pointer
23
22
  attach_function :Z3_apply_result_dec_ref, [:ctx_pointer, :apply_result_pointer], :void
24
23
  attach_function :Z3_apply_result_get_num_subgoals, [:ctx_pointer, :apply_result_pointer], :uint
25
24
  attach_function :Z3_apply_result_get_subgoal, [:ctx_pointer, :apply_result_pointer, :uint], :goal_pointer
@@ -53,6 +52,7 @@ module Z3
53
52
  attach_function :Z3_del_context, [:ctx_pointer], :void
54
53
  attach_function :Z3_disable_trace, [:string], :void
55
54
  attach_function :Z3_enable_trace, [:string], :void
55
+ attach_function :Z3_eval_smtlib2_string, [:ctx_pointer, :string], :string
56
56
  attach_function :Z3_finalize_memory, [], :void
57
57
  attach_function :Z3_fixedpoint_add_cover, [:ctx_pointer, :fixedpoint_pointer, :int, :func_decl_pointer, :ast_pointer], :void
58
58
  attach_function :Z3_fixedpoint_add_invariant, [:ctx_pointer, :fixedpoint_pointer, :func_decl_pointer, :ast_pointer], :void
@@ -145,13 +145,11 @@ module Z3
145
145
  attach_function :Z3_get_full_version, [], :string
146
146
  attach_function :Z3_get_func_decl_id, [:ctx_pointer, :func_decl_pointer], :uint
147
147
  attach_function :Z3_get_index_value, [:ctx_pointer, :ast_pointer], :uint
148
- attach_function :Z3_get_interpolant, [:ctx_pointer, :ast_pointer, :ast_pointer, :params_pointer], :ast_vector_pointer
149
148
  attach_function :Z3_get_num_probes, [:ctx_pointer], :uint
150
149
  attach_function :Z3_get_num_tactics, [:ctx_pointer], :uint
151
150
  attach_function :Z3_get_numeral_decimal_string, [:ctx_pointer, :ast_pointer, :uint], :string
152
151
  attach_function :Z3_get_numeral_string, [:ctx_pointer, :ast_pointer], :string
153
152
  attach_function :Z3_get_numerator, [:ctx_pointer, :ast_pointer], :ast_pointer
154
- attach_function :Z3_get_parser_error, [:ctx_pointer], :string
155
153
  attach_function :Z3_get_pattern, [:ctx_pointer, :pattern_pointer, :uint], :ast_pointer
156
154
  attach_function :Z3_get_pattern_num_terms, [:ctx_pointer, :pattern_pointer], :uint
157
155
  attach_function :Z3_get_probe_name, [:ctx_pointer, :uint], :string
@@ -181,6 +179,7 @@ module Z3
181
179
  attach_function :Z3_global_param_reset_all, [], :void
182
180
  attach_function :Z3_global_param_set, [:string, :string], :void
183
181
  attach_function :Z3_goal_assert, [:ctx_pointer, :goal_pointer, :ast_pointer], :void
182
+ attach_function :Z3_goal_convert_model, [:ctx_pointer, :goal_pointer, :model_pointer], :model_pointer
184
183
  attach_function :Z3_goal_dec_ref, [:ctx_pointer, :goal_pointer], :void
185
184
  attach_function :Z3_goal_depth, [:ctx_pointer, :goal_pointer], :uint
186
185
  attach_function :Z3_goal_formula, [:ctx_pointer, :goal_pointer, :uint], :ast_pointer
@@ -192,10 +191,10 @@ module Z3
192
191
  attach_function :Z3_goal_precision, [:ctx_pointer, :goal_pointer], :uint
193
192
  attach_function :Z3_goal_reset, [:ctx_pointer, :goal_pointer], :void
194
193
  attach_function :Z3_goal_size, [:ctx_pointer, :goal_pointer], :uint
194
+ attach_function :Z3_goal_to_dimacs_string, [:ctx_pointer, :goal_pointer], :string
195
195
  attach_function :Z3_goal_to_string, [:ctx_pointer, :goal_pointer], :string
196
196
  attach_function :Z3_goal_translate, [:ctx_pointer, :goal_pointer, :ctx_pointer], :goal_pointer
197
197
  attach_function :Z3_inc_ref, [:ctx_pointer, :ast_pointer], :void
198
- attach_function :Z3_interpolation_profile, [:ctx_pointer], :string
199
198
  attach_function :Z3_interrupt, [:ctx_pointer], :void
200
199
  attach_function :Z3_is_algebraic_number, [:ctx_pointer, :ast_pointer], :bool
201
200
  attach_function :Z3_is_app, [:ctx_pointer, :ast_pointer], :bool
@@ -203,7 +202,9 @@ module Z3
203
202
  attach_function :Z3_is_eq_ast, [:ctx_pointer, :ast_pointer, :ast_pointer], :bool
204
203
  attach_function :Z3_is_eq_func_decl, [:ctx_pointer, :func_decl_pointer, :func_decl_pointer], :bool
205
204
  attach_function :Z3_is_eq_sort, [:ctx_pointer, :sort_pointer, :sort_pointer], :bool
205
+ attach_function :Z3_is_lambda, [:ctx_pointer, :ast_pointer], :bool
206
206
  attach_function :Z3_is_numeral_ast, [:ctx_pointer, :ast_pointer], :bool
207
+ attach_function :Z3_is_quantifier_exists, [:ctx_pointer, :ast_pointer], :bool
207
208
  attach_function :Z3_is_quantifier_forall, [:ctx_pointer, :ast_pointer], :bool
208
209
  attach_function :Z3_is_well_sorted, [:ctx_pointer, :ast_pointer], :bool
209
210
  attach_function :Z3_mk_array_default, [:ctx_pointer, :ast_pointer], :ast_pointer
@@ -337,8 +338,6 @@ module Z3
337
338
  attach_function :Z3_mk_int_sort, [:ctx_pointer], :sort_pointer
338
339
  attach_function :Z3_mk_int_symbol, [:ctx_pointer, :int], :symbol_pointer
339
340
  attach_function :Z3_mk_int_to_str, [:ctx_pointer, :ast_pointer], :ast_pointer
340
- attach_function :Z3_mk_interpolant, [:ctx_pointer, :ast_pointer], :ast_pointer
341
- attach_function :Z3_mk_interpolation_context, [:config_pointer], :ctx_pointer
342
341
  attach_function :Z3_mk_is_int, [:ctx_pointer, :ast_pointer], :ast_pointer
343
342
  attach_function :Z3_mk_ite, [:ctx_pointer, :ast_pointer, :ast_pointer, :ast_pointer], :ast_pointer
344
343
  attach_function :Z3_mk_le, [:ctx_pointer, :ast_pointer, :ast_pointer], :ast_pointer
@@ -401,9 +400,9 @@ module Z3
401
400
  attach_function :Z3_model_has_interp, [:ctx_pointer, :model_pointer, :func_decl_pointer], :bool
402
401
  attach_function :Z3_model_inc_ref, [:ctx_pointer, :model_pointer], :void
403
402
  attach_function :Z3_model_to_string, [:ctx_pointer, :model_pointer], :string
403
+ attach_function :Z3_model_translate, [:ctx_pointer, :model_pointer, :ctx_pointer], :model_pointer
404
404
  attach_function :Z3_optimize_assert, [:ctx_pointer, :optimize_pointer, :ast_pointer], :void
405
405
  attach_function :Z3_optimize_assert_soft, [:ctx_pointer, :optimize_pointer, :ast_pointer, :string, :symbol_pointer], :uint
406
- attach_function :Z3_optimize_check, [:ctx_pointer, :optimize_pointer], :int
407
406
  attach_function :Z3_optimize_dec_ref, [:ctx_pointer, :optimize_pointer], :void
408
407
  attach_function :Z3_optimize_from_file, [:ctx_pointer, :optimize_pointer, :string], :void
409
408
  attach_function :Z3_optimize_from_string, [:ctx_pointer, :optimize_pointer, :string], :void
@@ -416,6 +415,7 @@ module Z3
416
415
  attach_function :Z3_optimize_get_param_descrs, [:ctx_pointer, :optimize_pointer], :param_descrs_pointer
417
416
  attach_function :Z3_optimize_get_reason_unknown, [:ctx_pointer, :optimize_pointer], :string
418
417
  attach_function :Z3_optimize_get_statistics, [:ctx_pointer, :optimize_pointer], :stats_pointer
418
+ attach_function :Z3_optimize_get_unsat_core, [:ctx_pointer, :optimize_pointer], :ast_vector_pointer
419
419
  attach_function :Z3_optimize_get_upper, [:ctx_pointer, :optimize_pointer, :uint], :ast_pointer
420
420
  attach_function :Z3_optimize_get_upper_as_vector, [:ctx_pointer, :optimize_pointer, :uint], :ast_vector_pointer
421
421
  attach_function :Z3_optimize_inc_ref, [:ctx_pointer, :optimize_pointer], :void
@@ -485,6 +485,7 @@ module Z3
485
485
  attach_function :Z3_solver_assert, [:ctx_pointer, :solver_pointer, :ast_pointer], :void
486
486
  attach_function :Z3_solver_assert_and_track, [:ctx_pointer, :solver_pointer, :ast_pointer, :ast_pointer], :void
487
487
  attach_function :Z3_solver_check, [:ctx_pointer, :solver_pointer], :int
488
+ attach_function :Z3_solver_cube, [:ctx_pointer, :solver_pointer, :ast_vector_pointer, :uint], :ast_vector_pointer
488
489
  attach_function :Z3_solver_dec_ref, [:ctx_pointer, :solver_pointer], :void
489
490
  attach_function :Z3_solver_from_file, [:ctx_pointer, :solver_pointer, :string], :void
490
491
  attach_function :Z3_solver_from_string, [:ctx_pointer, :solver_pointer, :string], :void
@@ -492,12 +493,15 @@ module Z3
492
493
  attach_function :Z3_solver_get_consequences, [:ctx_pointer, :solver_pointer, :ast_vector_pointer, :ast_vector_pointer, :ast_vector_pointer], :int
493
494
  attach_function :Z3_solver_get_help, [:ctx_pointer, :solver_pointer], :string
494
495
  attach_function :Z3_solver_get_model, [:ctx_pointer, :solver_pointer], :model_pointer
496
+ attach_function :Z3_solver_get_non_units, [:ctx_pointer, :solver_pointer], :ast_vector_pointer
495
497
  attach_function :Z3_solver_get_num_scopes, [:ctx_pointer, :solver_pointer], :uint
496
498
  attach_function :Z3_solver_get_param_descrs, [:ctx_pointer, :solver_pointer], :param_descrs_pointer
497
499
  attach_function :Z3_solver_get_proof, [:ctx_pointer, :solver_pointer], :ast_pointer
498
500
  attach_function :Z3_solver_get_reason_unknown, [:ctx_pointer, :solver_pointer], :string
499
501
  attach_function :Z3_solver_get_statistics, [:ctx_pointer, :solver_pointer], :stats_pointer
502
+ attach_function :Z3_solver_get_units, [:ctx_pointer, :solver_pointer], :ast_vector_pointer
500
503
  attach_function :Z3_solver_get_unsat_core, [:ctx_pointer, :solver_pointer], :ast_vector_pointer
504
+ attach_function :Z3_solver_import_model_converter, [:ctx_pointer, :solver_pointer, :solver_pointer], :void
501
505
  attach_function :Z3_solver_inc_ref, [:ctx_pointer, :solver_pointer], :void
502
506
  attach_function :Z3_solver_pop, [:ctx_pointer, :solver_pointer, :uint], :void
503
507
  attach_function :Z3_solver_push, [:ctx_pointer, :solver_pointer], :void
@@ -1,19 +1,11 @@
1
+ # This puzzle is ambiguous and different z3 versions return different result,
2
+ # so just checking that it doesn't crash
3
+
1
4
  describe "OneOfUs" do
2
- it do
3
- expect("oneofus").to have_output <<EOF
4
- grey Triangle grey Circle grey Triangle
5
- purple Square grey Triangle purple Triangle
6
- grey Triangle grey Square grey Triangle
5
+ let(:binary) { Pathname(__dir__) + "../../examples/oneofus" }
7
6
 
8
- Click 0: 0,1 - purple Square
9
- Click 1: 2,1 - purple Triangle
10
- Click 2: 2,2 - grey Triangle
11
- Click 3: 1,2 - grey Square
12
- Click 4: 1,1 - grey Triangle
13
- Click 5: 1,0 - grey Circle
14
- Click 6: 2,0 - grey Triangle
15
- Click 7: 0,0 - grey Triangle
16
- Click 8: 0,2 - grey Triangle
17
- EOF
7
+ it do
8
+ output = `#{binary}`.chomp
9
+ expect(output.lines.size).to eq(13)
18
10
  end
19
11
  end
@@ -43,14 +43,14 @@ module Z3
43
43
  # This is a very simple example of unknown satisfiablity
44
44
  # so we might need more complex one in the future
45
45
  # Unlike Z3::Solver, this is unknown even 4.6.0
46
- it "third way" do
46
+ it "unknown satisfiability" do
47
47
  optimize.assert a**3 == a
48
48
  expect(optimize.check).to eq(:unknown)
49
49
  expect{optimize.satisfiable?}.to raise_error("Satisfiability unknown")
50
50
  expect{optimize.unsatisfiable?}.to raise_error("Satisfiability unknown")
51
51
  end
52
52
 
53
- it "third way" do
53
+ it "unknown satisfiability" do
54
54
  optimize.assert a**a == a
55
55
  expect(optimize.check).to eq(:unknown)
56
56
  expect{optimize.satisfiable?}.to raise_error("Satisfiability unknown")
@@ -65,7 +65,7 @@ module Z3
65
65
  expect(optimize.model[a].to_i).to eq 9
66
66
  end
67
67
 
68
- it "maximize" do
68
+ it "minimize" do
69
69
  optimize.assert a > 0
70
70
  optimize.assert a < 10
71
71
  optimize.minimize a
@@ -25,9 +25,9 @@ module Z3
25
25
  b.include?(3),
26
26
  c == a.union(b),
27
27
  ]).to have_solution(
28
- a => "store(store(const(false), 1, true), 2, true)",
29
- b => "store(store(const(false), 3, true), 2, true)",
30
- c => "store(store(store(const(false), 1, true), 3, true), 2, true)",
28
+ a => "(lambda ((x!1 Int)) (or (= x!1 1) (= x!1 2)))",
29
+ b => "(lambda ((x!1 Int)) (or (= x!1 3) (= x!1 2)))",
30
+ c => "(lambda ((x!1 Int)) (or (= x!1 1) (= x!1 3) (= x!1 2)))",
31
31
  )
32
32
  end
33
33
 
@@ -41,9 +41,9 @@ module Z3
41
41
  b.include?(3),
42
42
  c == a.difference(b),
43
43
  ]).to have_solution(
44
- a => "store(store(const(false), 1, true), 2, true)",
45
- b => "store(const(true), 1, false)",
46
- c => "store(const(false), 1, true)",
44
+ a => "(lambda ((x!1 Int)) (or (= x!1 1) (= x!1 2)))",
45
+ b => "(lambda ((x!1 Int)) (not (= x!1 1)))",
46
+ c => "(lambda ((x!1 Int)) (= x!1 1))",
47
47
  )
48
48
  end
49
49
 
@@ -55,9 +55,9 @@ module Z3
55
55
  b.include?(3),
56
56
  c == a.intersection(b),
57
57
  ]).to have_solution(
58
- a => "store(store(const(false), 1, true), 2, true)",
59
- b => "store(store(const(false), 3, true), 2, true)",
60
- c => "store(store(store(const(false), 1, true), 3, true), 2, true)",
58
+ a => "(lambda ((x!1 Int)) (or (= x!1 1) (= x!1 2)))",
59
+ b => "(lambda ((x!1 Int)) (or (= x!1 3) (= x!1 2)))",
60
+ c => "(lambda ((x!1 Int)) (or (= x!1 1) (= x!1 3) (= x!1 2)))",
61
61
  )
62
62
  end
63
63
  end
data/spec/solver_spec.rb CHANGED
@@ -45,14 +45,14 @@ module Z3
45
45
  # so we might need more complex one in the future
46
46
  # This is now satisfiable in 4.6.0
47
47
  if Z3.version >= "4.6"
48
- it "third way (until 4.6 fix)" do
48
+ it "unknown satisfiability (until 4.6 fix)" do
49
49
  solver.assert a**3 == a
50
50
  expect(solver.check).to eq(:sat)
51
51
  expect(solver).to be_satisfiable
52
52
  expect(solver).to_not be_unsatisfiable
53
53
  end
54
54
  else
55
- it "third way (until 4.6 fix)" do
55
+ it "unknown satisfiability (until 4.6 fix)" do
56
56
  solver.assert a**3 == a
57
57
  expect(solver.check).to eq(:unknown)
58
58
  expect{solver.satisfiable?}.to raise_error("Satisfiability unknown")
@@ -60,7 +60,7 @@ module Z3
60
60
  end
61
61
  end
62
62
 
63
- it "third way" do
63
+ it "unknown satisfiability" do
64
64
  solver.assert a**a == a
65
65
  expect(solver.check).to eq(:unknown)
66
66
  expect{solver.satisfiable?}.to raise_error("Satisfiability unknown")
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.20180629
4
+ version: 0.0.20181126
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-06-29 00:00:00.000000000 Z
11
+ date: 2018-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -30,70 +30,70 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '12'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '12'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '3.8'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '3.8'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: simplecov
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '0.16'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '0.16'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: regexp_parser
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '1.3'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '1.3'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: ffi
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '1.9'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: '1.9'
97
97
  description: Ruby bindings for Z3 Constraint Solver
98
98
  email: Tomasz.Wegrzanowski@gmail.com
99
99
  executables: []
@@ -267,9 +267,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
267
267
  - !ruby/object:Gem::Version
268
268
  version: '0'
269
269
  requirements:
270
- - z3 library
270
+ - z3 library (4.8+)
271
271
  rubyforge_project:
272
- rubygems_version: 2.7.3
272
+ rubygems_version: 2.7.6
273
273
  signing_key:
274
274
  specification_version: 4
275
275
  summary: Z3 Constraint Solver