z3 0.0.20160330 → 0.0.20160427

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -0
  3. data/examples/{bridges_solver → bridges} +5 -12
  4. data/examples/bridges-1.txt +7 -0
  5. data/examples/{clogic_puzzle_solver → clogic_puzzle} +0 -0
  6. data/examples/four_hackers_puzzle +2 -1
  7. data/examples/{kakuro_solver → kakuro} +5 -15
  8. data/examples/kakuro-1.txt +10 -0
  9. data/examples/{knights_puzzle_solver → knights_puzzle} +4 -4
  10. data/examples/{letter_connections_solver → letter_connections} +6 -15
  11. data/examples/letter_connections-1.txt +10 -0
  12. data/examples/{light_up_solver → light_up} +5 -12
  13. data/examples/light_up-1.txt +7 -0
  14. data/examples/{minisudoku_solver → minisudoku} +8 -11
  15. data/examples/minisudoku-1.txt +6 -0
  16. data/examples/nonogram +152 -0
  17. data/examples/{selfref_solver → selfref} +0 -0
  18. data/examples/{sudoku_solver → sudoku} +9 -14
  19. data/examples/sudoku-1.txt +9 -0
  20. data/lib/z3.rb +10 -6
  21. data/lib/z3/ast.rb +33 -0
  22. data/lib/z3/{value/arith_value.rb → expr/arith_expr.rb} +3 -3
  23. data/lib/z3/{value/bitvec_value.rb → expr/bitvec_expr.rb} +1 -1
  24. data/lib/z3/{value/bool_value.rb → expr/bool_expr.rb} +5 -1
  25. data/lib/z3/{value/value.rb → expr/expr.rb} +7 -13
  26. data/lib/z3/expr/int_expr.rb +15 -0
  27. data/lib/z3/{value/int_value.rb → expr/real_expr.rb} +2 -2
  28. data/lib/z3/func_decl.rb +33 -23
  29. data/lib/z3/interface.rb +52 -30
  30. data/lib/z3/low_level.rb +10 -1
  31. data/lib/z3/low_level_auto.rb +83 -83
  32. data/lib/z3/model.rb +6 -5
  33. data/lib/z3/printer.rb +26 -0
  34. data/lib/z3/solver.rb +1 -5
  35. data/lib/z3/sort/bitvec_sort.rb +3 -3
  36. data/lib/z3/sort/bool_sort.rb +4 -4
  37. data/lib/z3/sort/int_sort.rb +2 -2
  38. data/lib/z3/sort/real_sort.rb +5 -5
  39. data/lib/z3/sort/sort.rb +22 -7
  40. data/lib/z3/very_low_level.rb +1 -1
  41. data/spec/bitvec_expr_spec.rb +55 -0
  42. data/spec/bitvec_sort_spec.rb +34 -0
  43. data/spec/bool_expr_spec.rb +65 -0
  44. data/spec/bool_sort_spec.rb +20 -0
  45. data/spec/{value_spec.rb → expr_spec.rb} +3 -3
  46. data/spec/int_expr_spec.rb +78 -0
  47. data/spec/int_sort_spec.rb +18 -0
  48. data/spec/integration/algebra_problems_spec.rb +19 -20
  49. data/spec/integration/basic_int_math_spec.rb +4 -5
  50. data/spec/integration/basic_logic_spec.rb +3 -4
  51. data/spec/integration/bit_tricks_spec.rb +2 -3
  52. data/spec/integration/bridges_spec.rb +2 -3
  53. data/spec/integration/four_hackers_puzzle_spec.rb +26 -0
  54. data/spec/integration/geometry_problem_spec.rb +10 -11
  55. data/spec/integration/kakuro_spec.rb +2 -3
  56. data/spec/integration/kinematics_problems_spec.rb +36 -37
  57. data/spec/integration/knights_puzzle_spec.rb +96 -0
  58. data/spec/integration/letter_connections_spec.rb +2 -3
  59. data/spec/integration/light_up_spec.rb +3 -4
  60. data/spec/integration/minisudoku_spec.rb +2 -3
  61. data/spec/integration/nonogram_spec.rb +26 -0
  62. data/spec/integration/selfref_spec.rb +2 -3
  63. data/spec/integration/sudoku_spec.rb +2 -3
  64. data/spec/integration/verbal_arithmetic_spec.rb +2 -3
  65. data/spec/model_spec.rb +13 -6
  66. data/spec/printer_spec.rb +22 -0
  67. data/spec/real_expr_spec.rb +64 -0
  68. data/spec/real_sort_spec.rb +24 -0
  69. data/spec/solver_spec.rb +11 -0
  70. data/spec/spec_helper.rb +39 -64
  71. metadata +81 -18
  72. data/lib/z3/value/real_value.rb +0 -7
@@ -1,7 +1,6 @@
1
1
  describe "Verbal Arithmetic" do
2
- let(:executable) { "#{__dir__}/../../examples/verbal_arithmetic" }
3
- it "can solve verbal arithmetic puzzles" do
4
- expect(IO.popen(executable).read).to eq <<EOF
2
+ it do
3
+ expect("verbal_arithmetic").to have_output <<EOF
5
4
  [["S", 9], ["E", 5], ["N", 6], ["D", 7]]
6
5
  [["M", 1], ["O", 0], ["R", 8], ["E", 5]]
7
6
  [["M", 1], ["O", 0], ["N", 6], ["E", 5], ["Y", 2]]
@@ -19,12 +19,19 @@ describe Z3::Model do
19
19
  solver.assert(a == 2)
20
20
  solver.assert(b == a+2)
21
21
  expect(solver.check).to eq(:sat)
22
- expect(model.model_eval(a).to_s).to eq("2")
23
- expect(model.model_eval(b).to_s).to eq("4")
24
- expect(model.model_eval(c).to_s).to eq("c")
25
- expect(model.model_eval(a, true).to_s).to eq("2")
26
- expect(model.model_eval(b, true).to_s).to eq("4")
27
- expect(model.model_eval(c, true).to_s).to eq("0")
22
+ expect(model.model_eval(a)).to be_same_as(Z3.Const(2))
23
+ expect(model.model_eval(b)).to be_same_as(Z3.Const(4))
24
+ expect(model.model_eval(c)).to be_same_as(c)
25
+ expect(model.model_eval(a, true)).to be_same_as(Z3.Const(2))
26
+ expect(model.model_eval(b, true)).to be_same_as(Z3.Const(4))
27
+ expect(model.model_eval(c, true)).to be_same_as(Z3.Const(0))
28
+ end
29
+
30
+ it "#to_a" do
31
+ solver.assert(a == 2)
32
+ solver.assert(b == a+2)
33
+ expect(solver.check).to eq(:sat)
34
+ expect(model.to_a).to be_same_as([[Z3.Int("a"), Z3.Const(2)], [Z3.Int("b"), Z3.Const(4)]])
28
35
  end
29
36
 
30
37
  it "#to_s" do
@@ -0,0 +1,22 @@
1
+ describe Z3::Printer do
2
+ it "numbers" do
3
+ expect(Z3::IntSort.new.from_const(42)).to stringify("42")
4
+ expect(Z3::IntSort.new.from_const(-42)).to stringify("-42")
5
+ expect(Z3::RealSort.new.from_const(42)).to stringify("42")
6
+ expect(Z3::RealSort.new.from_const(-42)).to stringify("-42")
7
+ expect(Z3::RealSort.new.from_const(3.14)).to stringify("157/50")
8
+ expect(Z3::RealSort.new.from_const(-3.14)).to stringify("-157/50")
9
+ end
10
+
11
+ it "booleans" do
12
+ expect(Z3.True).to stringify("true")
13
+ expect(Z3.False).to stringify("false")
14
+ end
15
+
16
+ it "variables" do
17
+ expect(Z3::Int("a")).to stringify("a")
18
+ expect(Z3::Real("a")).to stringify("a")
19
+ expect(Z3::Bool("a")).to stringify("a")
20
+ expect(Z3::Bitvec("a", 32)).to stringify("a")
21
+ end
22
+ end
@@ -0,0 +1,64 @@
1
+ describe Z3::RealExpr do
2
+ let(:a) { Z3::Real("a") }
3
+ let(:b) { Z3::Real("b") }
4
+ let(:c) { Z3::Real("c") }
5
+ let(:x) { Z3::Bool("x") }
6
+
7
+ it "+" do
8
+ expect([a == 2, b == 4, c == a + b]).to have_solution(c => 6)
9
+ end
10
+
11
+ it "-" do
12
+ expect([a == 2, b == 4, c == a - b]).to have_solution(c => -2)
13
+ end
14
+
15
+ it "*" do
16
+ expect([a == 2, b == 4, c == a * b]).to have_solution(c => 8)
17
+ end
18
+
19
+ it "/" do
20
+ expect([a == 10, b == 3, c == a / b]).to have_solution(c => "10/3")
21
+ expect([a == -10, b == 3, c == a / b]).to have_solution(c => "-10/3")
22
+ expect([a == 10, b == -3, c == a / b]).to have_solution(c => "-10/3")
23
+ expect([a == -10, b == -3, c == a / b]).to have_solution(c => "10/3")
24
+ end
25
+
26
+ it "==" do
27
+ expect([a == 2, b == 2, x == (a == b)]).to have_solution(x => true)
28
+ expect([a == 2, b == 3, x == (a == b)]).to have_solution(x => false)
29
+ end
30
+
31
+ it "!=" do
32
+ expect([a == 2, b == 2, x == (a != b)]).to have_solution(x => false)
33
+ expect([a == 2, b == 3, x == (a != b)]).to have_solution(x => true)
34
+ end
35
+
36
+ it ">" do
37
+ expect([a == 3, b == 2, x == (a > b)]).to have_solution(x => true)
38
+ expect([a == 2, b == 2, x == (a > b)]).to have_solution(x => false)
39
+ expect([a == 1, b == 2, x == (a > b)]).to have_solution(x => false)
40
+ end
41
+
42
+ it ">=" do
43
+ expect([a == 3, b == 2, x == (a >= b)]).to have_solution(x => true)
44
+ expect([a == 2, b == 2, x == (a >= b)]).to have_solution(x => true)
45
+ expect([a == 1, b == 2, x == (a >= b)]).to have_solution(x => false)
46
+ end
47
+
48
+ it "<" do
49
+ expect([a == 3, b == 2, x == (a < b)]).to have_solution(x => false)
50
+ expect([a == 2, b == 2, x == (a < b)]).to have_solution(x => false)
51
+ expect([a == 1, b == 2, x == (a < b)]).to have_solution(x => true)
52
+ end
53
+
54
+ it "<=" do
55
+ expect([a == 3, b == 2, x == (a <= b)]).to have_solution(x => false)
56
+ expect([a == 2, b == 2, x == (a <= b)]).to have_solution(x => true)
57
+ expect([a == 1, b == 2, x == (a <= b)]).to have_solution(x => true)
58
+ end
59
+
60
+ it "**" do
61
+ expect([a == 3, b == 4, c == (a ** b)]).to have_solution(c => 81)
62
+ expect([a == 81, b == 0.25, c == (a ** b)]).to have_solution(c => 3)
63
+ end
64
+ end
@@ -0,0 +1,24 @@
1
+ describe Z3::RealSort do
2
+ it "can instantiate constants" do
3
+ expect(subject.from_const(0).inspect).to eq("Real<0>")
4
+ expect(subject.from_const(42).inspect).to eq("Real<42>")
5
+ expect(subject.from_const(1_000_000_000_000).inspect).to eq("Real<1000000000000>")
6
+ expect(subject.from_const(-1_000_000_000_000).inspect).to eq("Real<-1000000000000>")
7
+ expect(subject.from_const(0.0).inspect).to eq("Real<0>")
8
+ expect(subject.from_const(-0.0).inspect).to eq("Real<0>")
9
+ expect(subject.from_const(3.14).inspect).to eq("Real<157/50>")
10
+ expect(subject.from_const(-3.14).inspect).to eq("Real<-157/50>")
11
+ end
12
+
13
+ it "raises exception when trying to convert constants of wrong type" do
14
+ expect{ subject.from_const(true) }.to raise_error(Z3::Exception)
15
+ expect{ subject.from_const(false) }.to raise_error(Z3::Exception)
16
+ expect{ subject.from_const(1.0 / 0.0) }.to raise_error(Z3::Exception)
17
+ expect{ subject.from_const(-1.0 / 0.0) }.to raise_error(Z3::Exception)
18
+ expect{ subject.from_const(0.0 / 0.0) }.to raise_error(Z3::Exception)
19
+ end
20
+
21
+ it "can instantiate variables" do
22
+ expect(Z3.Real("a").inspect).to eq("Real<a>")
23
+ end
24
+ end
@@ -19,4 +19,15 @@ describe Z3::Solver do
19
19
  solver.pop
20
20
  expect(solver.check).to eq(:sat)
21
21
  end
22
+
23
+ it "#assertions" do
24
+ solver.assert a + b == 4
25
+ solver.assert b >= 2
26
+ solver.assert Z3.Or(a == 2, a == -2)
27
+ expect(solver.assertions).to be_same_as([
28
+ a + b == 4,
29
+ b >= 2,
30
+ (a == 2) | (a == -2),
31
+ ])
32
+ end
22
33
  end
@@ -1,3 +1,5 @@
1
+ require "pry"
2
+
1
3
  if ENV["COVERAGE"]
2
4
  require 'simplecov'
3
5
  SimpleCov.start
@@ -5,23 +7,6 @@ end
5
7
 
6
8
  require_relative "../lib/z3"
7
9
 
8
- # This file was generated by the `rspec --init` command. Conventionally, all
9
- # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
10
- # The generated `.rspec` file contains `--require spec_helper` which will cause
11
- # this file to always be loaded, without a need to explicitly require it in any
12
- # files.
13
- #
14
- # Given that it is always loaded, you are encouraged to keep this file as
15
- # light-weight as possible. Requiring heavyweight dependencies from this file
16
- # will add to the boot time of your test suite on EVERY test run, even for an
17
- # individual file that may not need all of that loaded. Instead, consider making
18
- # a separate helper file that requires the additional dependencies and performs
19
- # the additional setup, and require it from the spec files that actually need
20
- # it.
21
- #
22
- # The `.rspec` file also contains a few flags that are not defaults but that
23
- # users commonly want.
24
- #
25
10
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
26
11
  RSpec.configure do |config|
27
12
  # rspec-expectations config goes here. You can use an alternate
@@ -46,58 +31,48 @@ RSpec.configure do |config|
46
31
  # `true` in RSpec 4.
47
32
  mocks.verify_partial_doubles = true
48
33
  end
34
+ end
49
35
 
50
- # The settings below are suggested to provide a good initial experience
51
- # with RSpec, but feel free to customize to your heart's content.
52
- =begin
53
- # These two settings work together to allow you to limit a spec run
54
- # to individual examples or groups you care about by tagging them with
55
- # `:focus` metadata. When nothing is tagged with `:focus`, all examples
56
- # get run.
57
- config.filter_run :focus
58
- config.run_all_when_everything_filtered = true
59
-
60
- # Allows RSpec to persist some state between runs in order to support
61
- # the `--only-failures` and `--next-failure` CLI options. We recommend
62
- # you configure your source control system to ignore this file.
63
- config.example_status_persistence_file_path = "spec/examples.txt"
64
-
65
- # Limits the available syntax to the non-monkey patched syntax that is
66
- # recommended. For more details, see:
67
- # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
68
- # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
69
- # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
70
- config.disable_monkey_patching!
36
+ RSpec::Matchers.define :have_output do |expected|
37
+ match do |file_name|
38
+ executable_path = "#{__dir__}/../examples/#{file_name}"
39
+ actual = IO.popen(executable_path).read
40
+ actual.gsub(/ *$/, "") == expected.gsub(/ *$/, "")
41
+ end
42
+ end
71
43
 
72
- # This setting enables warnings. It's recommended, but in some cases may
73
- # be too noisy due to issues in dependencies.
74
- config.warnings = true
44
+ RSpec::Matchers.define :be_same_as do |expected|
45
+ match do |file_name|
46
+ [actual.class, actual.inspect] == [expected.class, expected.inspect]
47
+ end
48
+ end
75
49
 
76
- # Many RSpec users commonly either run the entire suite or an individual
77
- # file, and it's useful to allow more verbose output when running an
78
- # individual spec file.
79
- if config.files_to_run.one?
80
- # Use the documentation formatter for detailed output,
81
- # unless a formatter has already been configured
82
- # (e.g. via a command-line flag).
83
- config.default_formatter = 'doc'
50
+ RSpec::Matchers.define :stringify do |expected|
51
+ match do |actual|
52
+ actual.to_s == expected
84
53
  end
54
+ end
85
55
 
86
- # Print the 10 slowest examples and example groups at the
87
- # end of the spec run, to help surface which specs are running
88
- # particularly slow.
89
- config.profile_examples = 10
56
+ RSpec::Matchers.define :have_solution do |expected|
57
+ match do |asts|
58
+ solver = setup_solver(asts)
59
+ solver.check == :sat and expected.all?{|var,val| solver.model[var].to_s == val.to_s}
60
+ end
90
61
 
91
- # Run specs in random order to surface order dependencies. If you find an
92
- # order dependency and want to debug it, you can fix the order by providing
93
- # the seed, which is printed after each run.
94
- # --seed 1234
95
- config.order = :random
62
+ failure_message do |asts|
63
+ solver = setup_solver(asts)
64
+ if solver.check == :sat
65
+ "expected #{asts.inspect} to have solution #{expected.inspect}, instead got #{solver.model}"
66
+ else
67
+ "expected #{asts.inspect} to have solution #{expected.inspect}, instead not solvable"
68
+ end
69
+ end
96
70
 
97
- # Seed global randomization in this process using the `--seed` CLI option.
98
- # Setting this allows you to use `--seed` to deterministically reproduce
99
- # test failures related to randomization by passing the same `--seed` value
100
- # as the one that triggered the failure.
101
- Kernel.srand config.seed
102
- =end
71
+ def setup_solver(asts)
72
+ Z3::Solver.new.tap do |solver|
73
+ asts.each do |ast|
74
+ solver.assert ast
75
+ end
76
+ end
77
+ end
103
78
  end
metadata CHANGED
@@ -1,15 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: z3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.20160330
4
+ version: 0.0.20160427
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomasz Wegrzanowski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-30 00:00:00.000000000 Z
11
+ date: 2016-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pry
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: simplecov
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
13
55
  - !ruby/object:Gem::Dependency
14
56
  name: ffi
15
57
  requirement: !ruby/object:Gem::Requirement
@@ -35,60 +77,81 @@ files:
35
77
  - examples/basic_int_math
36
78
  - examples/basic_logic
37
79
  - examples/bit_tricks
38
- - examples/bridges_solver
39
- - examples/clogic_puzzle_solver
80
+ - examples/bridges
81
+ - examples/bridges-1.txt
82
+ - examples/clogic_puzzle
40
83
  - examples/four_hackers_puzzle
41
84
  - examples/geometry_problem
42
- - examples/kakuro_solver
85
+ - examples/kakuro
86
+ - examples/kakuro-1.txt
43
87
  - examples/kinematics_problems
44
- - examples/knights_puzzle_solver
45
- - examples/letter_connections_solver
46
- - examples/light_up_solver
47
- - examples/minisudoku_solver
48
- - examples/selfref_solver
49
- - examples/sudoku_solver
88
+ - examples/knights_puzzle
89
+ - examples/letter_connections
90
+ - examples/letter_connections-1.txt
91
+ - examples/light_up
92
+ - examples/light_up-1.txt
93
+ - examples/minisudoku
94
+ - examples/minisudoku-1.txt
95
+ - examples/nonogram
96
+ - examples/selfref
97
+ - examples/sudoku
98
+ - examples/sudoku-1.txt
50
99
  - examples/verbal_arithmetic
51
100
  - lib/z3.rb
101
+ - lib/z3/ast.rb
52
102
  - lib/z3/context.rb
53
103
  - lib/z3/exception.rb
104
+ - lib/z3/expr/arith_expr.rb
105
+ - lib/z3/expr/bitvec_expr.rb
106
+ - lib/z3/expr/bool_expr.rb
107
+ - lib/z3/expr/expr.rb
108
+ - lib/z3/expr/int_expr.rb
109
+ - lib/z3/expr/real_expr.rb
54
110
  - lib/z3/func_decl.rb
55
111
  - lib/z3/interface.rb
56
112
  - lib/z3/low_level.rb
57
113
  - lib/z3/low_level_auto.rb
58
114
  - lib/z3/model.rb
115
+ - lib/z3/printer.rb
59
116
  - lib/z3/solver.rb
60
117
  - lib/z3/sort/bitvec_sort.rb
61
118
  - lib/z3/sort/bool_sort.rb
62
119
  - lib/z3/sort/int_sort.rb
63
120
  - lib/z3/sort/real_sort.rb
64
121
  - lib/z3/sort/sort.rb
65
- - lib/z3/value/arith_value.rb
66
- - lib/z3/value/bitvec_value.rb
67
- - lib/z3/value/bool_value.rb
68
- - lib/z3/value/int_value.rb
69
- - lib/z3/value/real_value.rb
70
- - lib/z3/value/value.rb
71
122
  - lib/z3/very_low_level.rb
72
123
  - lib/z3/very_low_level_auto.rb
124
+ - spec/bitvec_expr_spec.rb
125
+ - spec/bitvec_sort_spec.rb
126
+ - spec/bool_expr_spec.rb
127
+ - spec/bool_sort_spec.rb
128
+ - spec/expr_spec.rb
129
+ - spec/int_expr_spec.rb
130
+ - spec/int_sort_spec.rb
73
131
  - spec/integration/algebra_problems_spec.rb
74
132
  - spec/integration/basic_int_math_spec.rb
75
133
  - spec/integration/basic_logic_spec.rb
76
134
  - spec/integration/bit_tricks_spec.rb
77
135
  - spec/integration/bridges_spec.rb
136
+ - spec/integration/four_hackers_puzzle_spec.rb
78
137
  - spec/integration/geometry_problem_spec.rb
79
138
  - spec/integration/kakuro_spec.rb
80
139
  - spec/integration/kinematics_problems_spec.rb
140
+ - spec/integration/knights_puzzle_spec.rb
81
141
  - spec/integration/letter_connections_spec.rb
82
142
  - spec/integration/light_up_spec.rb
83
143
  - spec/integration/minisudoku_spec.rb
144
+ - spec/integration/nonogram_spec.rb
84
145
  - spec/integration/selfref_spec.rb
85
146
  - spec/integration/sudoku_spec.rb
86
147
  - spec/integration/verbal_arithmetic_spec.rb
87
148
  - spec/model_spec.rb
149
+ - spec/printer_spec.rb
150
+ - spec/real_expr_spec.rb
151
+ - spec/real_sort_spec.rb
88
152
  - spec/solver_spec.rb
89
153
  - spec/sort_spec.rb
90
154
  - spec/spec_helper.rb
91
- - spec/value_spec.rb
92
155
  - spec/z3_spec.rb
93
156
  homepage: https://github.com/taw/z3
94
157
  licenses: