z3 0.0.0 → 0.0.20160221

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9155c71b227576436cf55fe332fb04748bf8a2ed
4
- data.tar.gz: bf1c5200d857ed21311d2f5cb468e8cceac2f627
3
+ metadata.gz: 73f23f4e1511fe002de7b2e1d3d91945bc6f8be6
4
+ data.tar.gz: e6662d712ccaedd2b76a9c560dac242228d51311
5
5
  SHA512:
6
- metadata.gz: 67c4b499c50f0c288900667f13bcdcca543629d55332a6247011c8e135b1d9b41a4865f9900e2884155aa28844492c3fcb1d5aacad775e1b556e3d1a6a265d3a
7
- data.tar.gz: 88e74e1966920896bc2ca0ec8a2712c8180aeb79a97be8551aceb69b21016df907a579091fded5b688f8ebc8bdd3ad4ede8037f6a4458b7fa1831081b5f2bcee
6
+ metadata.gz: 206d8cb1e08173e3013da2426359a922c72631c28e84957ac8b94ce1219e5295960436fbd78513eb128cd0eb1b396bdf4f534247b183848ecb92df4d16d9e452
7
+ data.tar.gz: 04f74e3844e9e017bb6636cd26b96fd0cc79e05e59a86650c66fe18b271a3bc9798ee8481fb9979ec134cb298354f03c2b097b14f9c531166bf0f0ac87ea0ce6
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/z3"
4
+
5
+ class Bridges
6
+ def initialize(data)
7
+ data = data.strip.split("\n").map do |line|
8
+ line.split.map{|c| c == "_" ? nil : c.to_i}
9
+ end
10
+ @xsize = data[0].size
11
+ @ysize = data.size
12
+ @data = map_coordinates{|x,y| data[y][x]}
13
+ @solver = Z3::Solver.new
14
+ end
15
+
16
+ def solve!
17
+ @vars = {}
18
+ (0...@xsize).each do |x|
19
+ (0...@ysize).each do |y|
20
+ u = int012(x,y,"u")
21
+ d = int012(x,y,"d")
22
+ r = int012(x,y,"r")
23
+ l = int012(x,y,"l")
24
+ @vars[[x,y,"u"]] = u
25
+ @vars[[x,y,"d"]] = d
26
+ @vars[[x,y,"r"]] = r
27
+ @vars[[x,y,"l"]] = l
28
+ if @data[[x,y]] == nil
29
+ @solver.assert u == d
30
+ @solver.assert l == r
31
+ @solver.assert (u==0) | (l==0)
32
+ else
33
+ @solver.assert u+d+r+l == @data[[x,y]]
34
+ end
35
+ # Nothing goes out of the map
36
+ if x == 0
37
+ @solver.assert l == 0
38
+ end
39
+ if x == @xsize - 1
40
+ @solver.assert r == 0
41
+ end
42
+ if y == 0
43
+ @solver.assert u == 0
44
+ end
45
+ if y == @ysize - 1
46
+ @solver.assert d == 0
47
+ end
48
+ end
49
+ end
50
+
51
+ (0...@xsize).each do |x|
52
+ (0...@ysize).each do |y|
53
+ if x != @xsize-1
54
+ @solver.assert @vars[[x,y,"r"]] == @vars[[x+1,y,"l"]]
55
+ end
56
+ if y != @ysize-1
57
+ @solver.assert @vars[[x,y,"d"]] == @vars[[x,y+1,"u"]]
58
+ end
59
+ end
60
+ end
61
+
62
+ if @solver.check == :sat
63
+ @model = @solver.model
64
+ print_answer!
65
+ else
66
+ puts "failed to solve"
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def map_coordinates
73
+ Hash[(0...@xsize).to_a.product((0...@ysize).to_a).map{|x,y| [[x,y],yield(x,y)]}]
74
+ end
75
+
76
+ def print_answer!
77
+ picture = (0...@ysize*3).map do
78
+ [" "] * (3*@xsize)
79
+ end
80
+
81
+ @data.each do |(x,y),v|
82
+ if v == nil
83
+ u = @model[@vars[[x,y,"u"]]].to_s.to_i
84
+ l = @model[@vars[[x,y,"l"]]].to_s.to_i
85
+ if u > 0
86
+ picture[y*3+1][x*3+1] = " |\u2016"[u]
87
+ elsif l > 0
88
+ picture[y*3+1][x*3+1] = " -="[l]
89
+ else
90
+ picture[y*3+1][x*3+1] = " "
91
+ end
92
+ else
93
+ picture[y*3+1][x*3+1] = v.to_s
94
+ end
95
+ end
96
+
97
+ @data.each do |(x,y),_|
98
+ u = @model[@vars[[x,y,"u"]]].to_s.to_i
99
+ d = @model[@vars[[x,y,"d"]]].to_s.to_i
100
+ l = @model[@vars[[x,y,"l"]]].to_s.to_i
101
+ r = @model[@vars[[x,y,"r"]]].to_s.to_i
102
+
103
+ picture[y*3+1][x*3 ] = " -="[l]
104
+ picture[y*3+1][x*3+2] = " -="[r]
105
+ picture[y*3 ][x*3+1] = " |\u2016"[u]
106
+ picture[y*3+2][x*3+1] = " |\u2016"[d]
107
+ end
108
+
109
+ picture.each do |row|
110
+ puts row.join
111
+ end
112
+ end
113
+
114
+ def int012(x, y, d)
115
+ v = Z3::Ast.int("#{x},#{y},#{d}")
116
+ @solver.assert v >= 0
117
+ @solver.assert v <= 2
118
+ v
119
+ end
120
+ end
121
+
122
+ Bridges.new(
123
+ """
124
+ 3 _ _ 6 _ _ 4
125
+ _ 1 _ _ _ _ _
126
+ _ _ _ 4 _ 4 _
127
+ _ _ _ _ _ _ _
128
+ _ _ 1 _ 3 _ _
129
+ 1 _ _ _ _ 2 _
130
+ _ 3 _ _ 5 _ 3
131
+ """
132
+ ).solve!
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ class Hash
4
+ def compact
5
+ ht = {}
6
+ each do |k,v|
7
+ ht[k] = v unless v.nil?
8
+ end
9
+ ht
10
+ end
11
+ end
12
+
13
+ require_relative "../lib/z3"
14
+
15
+ class Kakuro
16
+ def initialize(data)
17
+ data = data.strip.split("\n").map do |line|
18
+ line.split.map{|cell| parse_cell(cell)}
19
+ end
20
+ @xsize = data[0].size
21
+ @ysize = data.size
22
+ @data = map_coordinates{|x,y| data[y][x]}
23
+ @solver = Z3::Solver.new
24
+ end
25
+
26
+ def solve!
27
+ @cells = map_coordinates{|x,y| cell_var(x,y) if @data[[x,y]] == nil}.compact
28
+
29
+ (0...@ysize).each do |y|
30
+ (0...@xsize).each do |x|
31
+ cell = @data[[x,y]]
32
+ next if cell == nil
33
+ (a,b) = cell
34
+ setup_line!(x,y,0,1,a)
35
+ setup_line!(x,y,1,0,b)
36
+ end
37
+ end
38
+
39
+ if @solver.check() == :sat
40
+ @model = @solver.model
41
+ print_board!
42
+ else
43
+ puts "failed to solve"
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def map_coordinates
50
+ Hash[(0...@xsize).to_a.product((0...@ysize).to_a).map{|x,y| [[x,y],yield(x,y)]}]
51
+ end
52
+
53
+ def print_board!
54
+ (0...@ysize).each do |y|
55
+ (0...@xsize).each do |x|
56
+ cell = @data[[x,y]]
57
+ if cell == nil
58
+ if @model and @cells.has_key?([x,y])
59
+ a = @model[@cells[[x,y]]].to_s
60
+ print(" [#{a}] ")
61
+ else
62
+ print(" _ ")
63
+ end
64
+ elsif cell == [0,0]
65
+ print(" x ")
66
+ else
67
+ (a,b) = cell
68
+ a = if a == 0 then " " else ("%2d" % a) end
69
+ b = if b == 0 then " " else ("%-2d" % b) end
70
+ print("#{a}/#{b}")
71
+ end
72
+ print " "
73
+ end
74
+ print "\n"
75
+ end
76
+ end
77
+
78
+ def parse_cell(cell)
79
+ if cell == "_"
80
+ nil
81
+ elsif cell == "x"
82
+ [0,0]
83
+ else
84
+ a,b = cell.split("/")
85
+ [a.to_i, b.to_i]
86
+ end
87
+ end
88
+
89
+ def cell_var(x,y)
90
+ v = Z3::Ast.int("c#{x},#{y}")
91
+ @solver.assert v >= 1
92
+ @solver.assert v <= 9
93
+ v
94
+ end
95
+
96
+ def setup_line!(x0, y0, dx, dy, sum)
97
+ return if sum == 0
98
+ vs = []
99
+ x, y = x0+dx, y0+dy
100
+ while @cells.has_key?([x,y])
101
+ vs << @cells[[x,y]]
102
+ x += dx
103
+ y += dy
104
+ end
105
+ return if vs.empty?
106
+ @solver.assert Z3::Ast.distinct(*vs)
107
+ @solver.assert Z3::Ast.add(*vs) == sum
108
+ end
109
+ end
110
+
111
+ Kakuro.new(
112
+ """
113
+ x x x 10/ 24/ 29/ x 11/ 21/ 10/
114
+ x 11/ 19/24 _ _ _ /6 _ _ _
115
+ /31 _ _ _ _ _ 10/20 _ _ _
116
+ /4 _ _ 22/18 _ _ _ 23/13 _ _
117
+ /18 _ _ _ 24/26 _ _ _ _ _
118
+ x 19/ 30/16 _ _ 10/11 _ _ 11/ 20/
119
+ /34 _ _ _ _ _ 23/23 _ _ _
120
+ /7 _ _ 9/16 _ _ _ 3/4 _ _
121
+ /24 _ _ _ /23 _ _ _ _ _
122
+ /10 _ _ _ /11 _ _ _ x x
123
+ """
124
+ ).solve!
@@ -0,0 +1,199 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # NOTE: This solver can fill empty spaces with phantom loops,
4
+ # so it's not technically totally legit true
5
+ # As in:
6
+ # A..
7
+ # A..
8
+ #
9
+ # Into:
10
+ # A* A→ A↓
11
+ # A↑ A↑ A←
12
+ #
13
+ # Instead of more correct:
14
+ #
15
+ # A* A← A←
16
+ # A→ A→ A↑
17
+ #
18
+ # This affects few enough real world puzzles and would complicate solution enough
19
+ # that I let it be.
20
+ require_relative "../lib/z3"
21
+
22
+ class LetterConnections
23
+ def initialize(data)
24
+ data = data.strip.split("\n")
25
+ @xsize = data[0].size
26
+ @ysize = data.size
27
+ @letters = {}
28
+ @rletters = {}
29
+ @starts = {}
30
+ @ends = {}
31
+ @special_ends = {}
32
+ @special_starts = {}
33
+
34
+ data = map_coordinates{|x,y| data[y][x]}
35
+
36
+ data.sort.each do |(x,y), letter|
37
+ next if letter == "."
38
+ if @letters.has_key?(letter)
39
+ if @ends.has_key?(letter)
40
+ raise "Letter #{letter} occurs more than twice"
41
+ end
42
+ @ends[letter] = [x,y]
43
+ @special_ends[[x,y]] = letter
44
+ else
45
+ i = @letters.size
46
+ @letters[letter] = i
47
+ @rletters[i] = letter
48
+ @starts[letter] = [x,y]
49
+ @special_starts[[x,y]] = letter
50
+ end
51
+ end
52
+ @letters.each_key do |letter|
53
+ unless @ends.has_key?(letter)
54
+ raise "Letter #{letter} occurs only once"
55
+ end
56
+ end
57
+
58
+ @solver = Z3::Solver.new
59
+ end
60
+
61
+ def solve!
62
+ @line = map_coordinates{|x,y| line_var(x,y) }
63
+ @dir = map_coordinates{|x,y| dir_var(x,y) }
64
+
65
+ @letters.each do |letter, i|
66
+ @solver.assert @line[@starts[letter]] == i
67
+ @solver.assert @line[@ends[letter]] == i
68
+ end
69
+
70
+ (0...@ysize).each do |y|
71
+ (0...@xsize).each do |x|
72
+ next if @special_ends.has_key?([x,y])
73
+ # Direction Left
74
+ if x == 0
75
+ @solver.assert @dir[[x,y]] != 0
76
+ else
77
+ @solver.assert Z3::Ast.implies(@dir[[x,y]] == 0, @line[[x,y]] == @line[[x-1,y]])
78
+ @solver.assert Z3::Ast.implies(@dir[[x,y]] == 0, @dir[[x-1,y]] != 2)
79
+ end
80
+ # Direction Up
81
+ if y == 0
82
+ @solver.assert @dir[[x,y]] != 1
83
+ else
84
+ @solver.assert Z3::Ast.implies(@dir[[x,y]] == 1, @line[[x,y]] == @line[[x,y-1]])
85
+ @solver.assert Z3::Ast.implies(@dir[[x,y]] == 1, @dir[[x,y-1]] != 3)
86
+ end
87
+ # Direction Right
88
+ if x == @xsize - 1
89
+ @solver.assert @dir[[x,y]] != 2
90
+ else
91
+ @solver.assert Z3::Ast.implies(@dir[[x,y]] == 2, @line[[x,y]] == @line[[x+1,y]])
92
+ @solver.assert Z3::Ast.implies(@dir[[x,y]] == 2, @dir[[x+1,y]] != 0)
93
+ end
94
+ # Direction Down
95
+ if y == @ysize - 1
96
+ @solver.assert @dir[[x,y]] != 3
97
+ else
98
+ @solver.assert Z3::Ast.implies(@dir[[x,y]] == 3, @line[[x,y]] == @line[[x,y+1]])
99
+ @solver.assert Z3::Ast.implies(@dir[[x,y]] == 3, @dir[[x,y+1]] != 1)
100
+ end
101
+ end
102
+ end
103
+
104
+ # Everything except start node has one incoming arrow
105
+ # End nodes not counted for this
106
+
107
+ (0...@ysize).each do |y|
108
+ (0...@xsize).each do |x|
109
+ next if @special_starts.has_key?([x,y])
110
+ potential_incoming = potential_incoming(x,y)
111
+ condition_exactly_one(
112
+ potential_incoming.map{|i,j,d| @dir[[i,j]] == d}
113
+ )
114
+ end
115
+ end
116
+ if @solver.check == :sat
117
+ @model = @solver.model
118
+ print_answer!
119
+ else
120
+ puts "failed to solve"
121
+ end
122
+ end
123
+
124
+ private
125
+
126
+ def map_coordinates
127
+ Hash[(0...@xsize).to_a.product((0...@ysize).to_a).map{|x,y| [[x,y],yield(x,y)]}]
128
+ end
129
+
130
+ def line_var(x, y)
131
+ v = Z3::Ast.int("l#{x},#{y}")
132
+ @solver.assert v >= 0
133
+ @solver.assert v < @letters.size
134
+ v
135
+ end
136
+
137
+ def dir_var(x, y)
138
+ v = Z3::Ast.int("d#{x},#{y}")
139
+ @solver.assert v >= 0
140
+ @solver.assert v <= 3
141
+ v
142
+ end
143
+
144
+ def potential_incoming(x0, y0)
145
+ [
146
+ [x0+1,y0,0],
147
+ [x0-1,y0,2],
148
+ [x0,y0+1,1],
149
+ [x0,y0-1,3],
150
+ ].select do |x,y,d|
151
+ @dir.has_key?([x,y]) and not @special_ends.has_key?([x,y])
152
+ end
153
+ end
154
+
155
+ # Surely Z3 must have a thing for it
156
+ def condition_exactly_one(conds)
157
+ @solver.assert Z3::Ast.or(*conds)
158
+ (0...conds.size).each do |ci|
159
+ (0...conds.size).each do |cj|
160
+ if ci < cj
161
+ @solver.assert ~conds[ci] | ~conds[cj]
162
+ end
163
+ end
164
+ end
165
+ end
166
+
167
+ def print_answer!
168
+ (0...@ysize).each do |y|
169
+ (0...@xsize).each do |x|
170
+ li = @model[@line[[x,y]]].to_s.to_i
171
+ l = @rletters[li]
172
+ d = @model[@dir[[x,y]]].to_s.to_i
173
+ if [x,y] == @starts[l]
174
+ print("\u2190\u2191\u2192\u2193"[d]+l+" ")
175
+ elsif [x,y] == @ends[l]
176
+ print("*"+l+" ")
177
+ else
178
+ print("\u2190\u2191\u2192\u2193"[d]+l.downcase+" ")
179
+ end
180
+ end
181
+ puts ""
182
+ end
183
+ end
184
+ end
185
+
186
+ LetterConnections.new(
187
+ """
188
+ ..KJ....FE
189
+ .FJ.......
190
+ ......G...
191
+ .K.I......
192
+ .......D..
193
+ IE......B.
194
+ ...H...CD.
195
+ ...A..C...
196
+ .A.H......
197
+ ...B.G....
198
+ """
199
+ ).solve!
data/lib/z3/ast.rb CHANGED
@@ -48,7 +48,7 @@ class Z3::Ast
48
48
  private def binary_int_operator(op, b)
49
49
  b = Z3::Ast.from_const(b, sort) unless b.is_a?(Z3::Ast)
50
50
  raise Z3::Exception, "Can only be used on integers" unless int? and b.int?
51
- Z3::Ast.send(op, a, b)
51
+ Z3::Ast.send(op, self, b)
52
52
  end
53
53
 
54
54
  def |(b)
data/lib/z3/low_level.rb CHANGED
@@ -3,7 +3,6 @@
3
3
 
4
4
  module Z3::LowLevel
5
5
  class << self
6
- # Common API
7
6
  def get_version
8
7
  a = FFI::MemoryPointer.new(:int)
9
8
  b = FFI::MemoryPointer.new(:int)
@@ -17,87 +16,10 @@ module Z3::LowLevel
17
16
  Z3::VeryLowLevel.Z3_set_error_handler(_ctx_pointer, block)
18
17
  end
19
18
 
20
- def global_param_set(k,v)
21
- Z3::VeryLowLevel.Z3_global_param_set(k.to_s, v.to_s)
22
- end
23
-
24
- # Context API
25
19
  def mk_context
26
20
  Z3::VeryLowLevel.Z3_mk_context
27
21
  end
28
22
 
29
- # Symbol API
30
- def mk_string_symbol(name)
31
- Z3::VeryLowLevel.Z3_mk_string_symbol(_ctx_pointer, name)
32
- end
33
-
34
- def get_symbol_string(symbol)
35
- Z3::VeryLowLevel.Z3_get_symbol_string(_ctx_pointer, symbol)
36
- end
37
-
38
- # Sort API
39
- def mk_bool_sort
40
- Z3::VeryLowLevel.Z3_mk_bool_sort(_ctx_pointer)
41
- end
42
-
43
- def mk_int_sort
44
- Z3::VeryLowLevel.Z3_mk_int_sort(_ctx_pointer)
45
- end
46
-
47
- def mk_real_sort
48
- Z3::VeryLowLevel.Z3_mk_real_sort(_ctx_pointer)
49
- end
50
-
51
- def sort_to_string(sort)
52
- Z3::VeryLowLevel.Z3_sort_to_string(_ctx_pointer, sort._sort)
53
- end
54
-
55
- # Solver API
56
- def mk_solver
57
- Z3::VeryLowLevel.Z3_mk_solver(_ctx_pointer)
58
- end
59
-
60
- def solver_push(solver)
61
- Z3::VeryLowLevel.Z3_solver_push(_ctx_pointer, solver._solver)
62
- end
63
-
64
- def solver_pop(solver, n)
65
- Z3::VeryLowLevel.Z3_solver_pop(_ctx_pointer, solver._solver, n)
66
- end
67
-
68
- def solver_reset(solver)
69
- Z3::VeryLowLevel.Z3_solver_reset(_ctx_pointer, solver._solver)
70
- end
71
-
72
- def solver_assert(solver, ast)
73
- Z3::VeryLowLevel.Z3_solver_assert(_ctx_pointer, solver._solver, ast._ast)
74
- end
75
-
76
- def solver_check(solver)
77
- Z3::VeryLowLevel.Z3_solver_check(_ctx_pointer, solver._solver)
78
- end
79
-
80
- def solver_inc_ref(solver)
81
- Z3::VeryLowLevel.Z3_solver_inc_ref(_ctx_pointer, solver._solver)
82
- end
83
-
84
- # Model API
85
- def solver_get_model(solver)
86
- Z3::VeryLowLevel.Z3_solver_get_model(_ctx_pointer, solver._solver)
87
- end
88
-
89
- def model_get_num_consts(model)
90
- Z3::VeryLowLevel.Z3_model_get_num_consts(_ctx_pointer, model._model)
91
- end
92
-
93
- def model_get_num_funcs(model)
94
- Z3::VeryLowLevel.Z3_model_get_num_funcs(_ctx_pointer, model._model)
95
- end
96
-
97
- def model_get_num_sorts(model)
98
- Z3::VeryLowLevel.Z3_model_get_num_sorts(_ctx_pointer, model._model)
99
- end
100
-
101
23
  def model_eval(model, ast, model_completion)
102
24
  rv_ptr = FFI::MemoryPointer.new(:pointer)
103
25
  result = Z3::VeryLowLevel.Z3_model_eval(_ctx_pointer, model._model, ast._ast, !!model_completion, rv_ptr)
@@ -108,84 +30,6 @@ module Z3::LowLevel
108
30
  end
109
31
  end
110
32
 
111
- def model_get_const_decl(model, i)
112
- Z3::VeryLowLevel.Z3_model_get_const_decl(_ctx_pointer, model._model, i)
113
- end
114
-
115
- # FuncDecl API
116
- def func_decl_to_ast(func_decl)
117
- Z3::VeryLowLevel.Z3_func_decl_to_ast(_ctx_pointer, func_decl._func_decl)
118
- end
119
-
120
- def get_decl_name(func_decl)
121
- Z3::VeryLowLevel.Z3_get_decl_name(_ctx_pointer, func_decl._func_decl)
122
- end
123
-
124
- def get_arity(func_decl)
125
- Z3::VeryLowLevel.Z3_get_arity(_ctx_pointer, func_decl._func_decl)
126
- end
127
-
128
- def get_decl_ast_parameter(func_decl, i)
129
- Z3::VeryLowLevel.Z3_get_decl_ast_parameter(_ctx_pointer, func_decl._func_decl, i)
130
- end
131
-
132
- def model_get_const_interp(model, func_decl)
133
- Z3::VeryLowLevel.Z3_model_get_const_interp(_ctx_pointer, model._model, func_decl._func_decl)
134
- end
135
-
136
- # AST API
137
- def mk_true
138
- Z3::VeryLowLevel.Z3_mk_true(_ctx_pointer)
139
- end
140
-
141
- def mk_false
142
- Z3::VeryLowLevel.Z3_mk_false(_ctx_pointer)
143
- end
144
-
145
- def mk_eq(a,b)
146
- Z3::VeryLowLevel.Z3_mk_eq(_ctx_pointer, a._ast, b._ast)
147
- end
148
-
149
- def mk_ge(a,b)
150
- Z3::VeryLowLevel.Z3_mk_ge(_ctx_pointer, a._ast, b._ast)
151
- end
152
-
153
- def mk_gt(a,b)
154
- Z3::VeryLowLevel.Z3_mk_gt(_ctx_pointer, a._ast, b._ast)
155
- end
156
-
157
- def mk_le(a,b)
158
- Z3::VeryLowLevel.Z3_mk_le(_ctx_pointer, a._ast, b._ast)
159
- end
160
-
161
- def mk_lt(a,b)
162
- Z3::VeryLowLevel.Z3_mk_lt(_ctx_pointer, a._ast, b._ast)
163
- end
164
-
165
- def mk_power(a,b)
166
- Z3::VeryLowLevel.Z3_mk_power(_ctx_pointer, a._ast, b._ast)
167
- end
168
-
169
- def mk_rem(a,b)
170
- Z3::VeryLowLevel.Z3_mk_rem(_ctx_pointer, a._ast, b._ast)
171
- end
172
-
173
- def mk_mod(a,b)
174
- Z3::VeryLowLevel.Z3_mk_mod(_ctx_pointer, a._ast, b._ast)
175
- end
176
-
177
- def mk_div(a,b)
178
- Z3::VeryLowLevel.Z3_mk_div(_ctx_pointer, a._ast, b._ast)
179
- end
180
-
181
- def mk_not(a)
182
- Z3::VeryLowLevel.Z3_mk_not(_ctx_pointer, a._ast)
183
- end
184
-
185
- def mk_const(_symbol, sort)
186
- Z3::VeryLowLevel.Z3_mk_const(_ctx_pointer, _symbol, sort._sort)
187
- end
188
-
189
33
  def mk_and(asts)
190
34
  Z3::VeryLowLevel.Z3_mk_and(_ctx_pointer, asts.size, asts_vector(asts))
191
35
  end
@@ -194,14 +38,6 @@ module Z3::LowLevel
194
38
  Z3::VeryLowLevel.Z3_mk_or(_ctx_pointer, asts.size, asts_vector(asts))
195
39
  end
196
40
 
197
- def mk_iff(asts)
198
- Z3::VeryLowLevel.Z3_mk_iff(_ctx_pointer, a._ast, b._ast)
199
- end
200
-
201
- def mk_implies(a, b)
202
- Z3::VeryLowLevel.Z3_mk_implies(_ctx_pointer, a._ast, b._ast)
203
- end
204
-
205
41
  def mk_mul(asts)
206
42
  Z3::VeryLowLevel.Z3_mk_mul(_ctx_pointer, asts.size, asts_vector(asts))
207
43
  end
@@ -218,25 +54,8 @@ module Z3::LowLevel
218
54
  Z3::VeryLowLevel.Z3_mk_distinct(_ctx_pointer, asts.size, asts_vector(asts))
219
55
  end
220
56
 
221
- def ast_to_string(ast)
222
- Z3::VeryLowLevel.Z3_ast_to_string(_ctx_pointer, ast._ast)
223
- end
224
-
225
- def get_sort(ast)
226
- Z3::VeryLowLevel.Z3_get_sort(_ctx_pointer, ast._ast)
227
- end
228
-
229
- def mk_int2real(ast)
230
- Z3::VeryLowLevel.Z3_mk_int2real(_ctx_pointer, ast._ast)
231
- end
232
-
233
- def mk_numeral(str, sort)
234
- Z3::VeryLowLevel.Z3_mk_numeral(_ctx_pointer, str, sort._sort)
235
- end
236
-
237
- def mk_unary_minus(ast)
238
- Z3::VeryLowLevel.Z3_mk_unary_minus(_ctx_pointer, ast._ast)
239
- end
57
+ ### Automatically generated, do not edit that file
58
+ eval open("#{__dir__}/low_level_auto.rb").read
240
59
 
241
60
  private
242
61