z3 0.0.20160221 → 0.0.20160323
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -1
- data/examples/algebra_problems +24 -24
- data/examples/basic_int_math +8 -8
- data/examples/basic_logic +8 -8
- data/examples/bit_tricks +161 -0
- data/examples/bridges_solver +1 -1
- data/examples/clogic_puzzle_solver +135 -0
- data/examples/four_hackers_puzzle +194 -0
- data/examples/geometry_problem +11 -11
- data/examples/kakuro_solver +3 -3
- data/examples/kinematics_problems +37 -37
- data/examples/letter_connections_solver +11 -11
- data/examples/light_up_solver +5 -5
- data/examples/minisudoku_solver +4 -4
- data/examples/selfref_solver +35 -35
- data/examples/sudoku_solver +4 -4
- data/examples/verbal_arithmetic +2 -2
- data/lib/z3/exception.rb +25 -0
- data/lib/z3/func_decl.rb +7 -7
- data/lib/z3/interface.rb +255 -0
- data/lib/z3/low_level.rb +4 -6
- data/lib/z3/low_level_auto.rb +1551 -1547
- data/lib/z3/model.rb +3 -2
- data/lib/z3/solver.rb +65 -54
- data/lib/z3/sort/bitvec_sort.rb +40 -0
- data/lib/z3/sort/bool_sort.rb +31 -0
- data/lib/z3/sort/int_sort.rb +21 -0
- data/lib/z3/sort/real_sort.rb +36 -0
- data/lib/z3/sort/sort.rb +76 -0
- data/lib/z3/value/arith_value.rb +53 -0
- data/lib/z3/value/bitvec_value.rb +67 -0
- data/lib/z3/value/bool_value.rb +29 -0
- data/lib/z3/value/int_value.rb +7 -0
- data/lib/z3/value/real_value.rb +7 -0
- data/lib/z3/value/value.rb +48 -0
- data/lib/z3/very_low_level.rb +28 -45
- data/lib/z3/very_low_level_auto.rb +518 -516
- data/lib/z3.rb +23 -33
- data/spec/integration/bit_tricks_spec.rb +21 -0
- data/spec/model_spec.rb +9 -9
- data/spec/solver_spec.rb +2 -2
- data/spec/sort_spec.rb +38 -13
- data/spec/{ast_spec.rb → value_spec.rb} +60 -57
- metadata +21 -6
- data/lib/z3/ast.rb +0 -302
- data/lib/z3/sort.rb +0 -33
- /data/spec/integration/{bagic_int_math_spec.rb → basic_int_math_spec.rb} +0 -0
data/lib/z3/model.rb
CHANGED
@@ -23,7 +23,7 @@ class Z3::Model
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def model_eval(ast, model_completion=false)
|
26
|
-
Z3::
|
26
|
+
Z3::Value.new_from_pointer(Z3::LowLevel.model_eval(self, ast, model_completion))
|
27
27
|
end
|
28
28
|
|
29
29
|
def [](ast)
|
@@ -40,9 +40,10 @@ class Z3::Model
|
|
40
40
|
|
41
41
|
def each
|
42
42
|
consts.sort_by(&:name).each do |c|
|
43
|
+
_ast = Z3::LowLevel.model_get_const_interp(self, c)
|
43
44
|
yield(
|
44
45
|
c.name,
|
45
|
-
Z3::
|
46
|
+
Z3::Value.new_from_pointer(_ast)
|
46
47
|
)
|
47
48
|
end
|
48
49
|
end
|
data/lib/z3/solver.rb
CHANGED
@@ -1,68 +1,79 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
module Z3
|
2
|
+
class Solver
|
3
|
+
attr_reader :_solver
|
4
|
+
def initialize
|
5
|
+
@_solver = Z3::LowLevel.mk_solver
|
6
|
+
Z3::LowLevel.solver_inc_ref(self)
|
7
|
+
end
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
9
|
+
def push
|
10
|
+
Z3::LowLevel.solver_push(self)
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
def pop(n=1)
|
14
|
+
Z3::LowLevel.solver_pop(self, n)
|
15
|
+
end
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
def reset
|
18
|
+
Z3::LowLevel.solver_reset(self)
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
def assert(ast)
|
22
|
+
Z3::LowLevel.solver_assert(self, ast)
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
def check
|
26
|
+
check_sat_results(Z3::LowLevel.solver_check(self))
|
27
|
+
end
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
def model
|
30
|
+
Z3::Model.new(
|
31
|
+
Z3::LowLevel.solver_get_model(self)
|
32
|
+
)
|
33
|
+
end
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
35
|
+
def assertions
|
36
|
+
_ast_vector = Z3::LowLevel.solver_get_assertions(self)
|
37
|
+
n = Z3::VeryLowLevel.Z3_ast_vector_size(Z3::LowLevel._ctx_pointer, _ast_vector)
|
38
|
+
(0...n).map{|i|
|
39
|
+
_ast = Z3::VeryLowLevel.Z3_ast_vector_get(Z3::LowLevel._ctx_pointer, _ast_vector, i)
|
40
|
+
Z3::Value.new_from_pointer(_ast)
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
def prove!(ast)
|
45
|
+
push
|
46
|
+
assert(~ast)
|
47
|
+
case check
|
48
|
+
when :sat
|
49
|
+
puts "Counterexample exists"
|
50
|
+
model.each do |n,v|
|
51
|
+
puts "* #{n} = #{v}"
|
52
|
+
end
|
53
|
+
when :unknown
|
54
|
+
puts "Unknown"
|
55
|
+
when :unsat
|
56
|
+
puts "Proven"
|
57
|
+
else
|
58
|
+
raise "Wrong SAT result #{r}"
|
42
59
|
end
|
43
|
-
|
44
|
-
|
45
|
-
when :unsat
|
46
|
-
puts "Proven"
|
47
|
-
else
|
48
|
-
raise "Wrong SAT result #{r}"
|
60
|
+
ensure
|
61
|
+
pop
|
49
62
|
end
|
50
|
-
ensure
|
51
|
-
pop
|
52
|
-
end
|
53
63
|
|
54
|
-
|
64
|
+
private
|
55
65
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
+
def check_sat_results(r)
|
67
|
+
case r
|
68
|
+
when 1
|
69
|
+
:sat
|
70
|
+
when 0
|
71
|
+
:unknown
|
72
|
+
when -1
|
73
|
+
:unsat
|
74
|
+
else
|
75
|
+
raise "Wrong SAT result #{r}"
|
76
|
+
end
|
66
77
|
end
|
67
78
|
end
|
68
79
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Z3
|
2
|
+
class BitvecSort < Sort
|
3
|
+
def initialize(n)
|
4
|
+
super LowLevel.mk_bv_sort(n)
|
5
|
+
end
|
6
|
+
|
7
|
+
def value_class
|
8
|
+
BitvecValue
|
9
|
+
end
|
10
|
+
|
11
|
+
def from_const(val)
|
12
|
+
if val.is_a?(Integer) or val.is_a?(Float)
|
13
|
+
new LowLevel.mk_numeral(val.to_s, self)
|
14
|
+
else
|
15
|
+
raise Z3::Exception, "Cannot convert #{val.class} to #{self.class}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def size
|
20
|
+
LowLevel.get_bv_sort_size(self)
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
"Bitvec(#{size})"
|
25
|
+
end
|
26
|
+
|
27
|
+
def inspect
|
28
|
+
"BitvecSort(#{size})"
|
29
|
+
end
|
30
|
+
|
31
|
+
def >(other)
|
32
|
+
raise ArgumentError unless other.is_a?(Sort)
|
33
|
+
return true if other.is_a?(IntSort)
|
34
|
+
return true if other.is_a?(BitvecSort) and size > other.size
|
35
|
+
false
|
36
|
+
end
|
37
|
+
|
38
|
+
public_class_method :new
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Z3
|
2
|
+
class BoolSort < Sort
|
3
|
+
def initialize
|
4
|
+
super LowLevel.mk_bool_sort
|
5
|
+
end
|
6
|
+
|
7
|
+
def value_class
|
8
|
+
BoolValue
|
9
|
+
end
|
10
|
+
|
11
|
+
def from_const(val)
|
12
|
+
if val == true
|
13
|
+
BoolValue.new(LowLevel.mk_true, self)
|
14
|
+
elsif val == false
|
15
|
+
BoolValue.new(LowLevel.mk_false, self)
|
16
|
+
else
|
17
|
+
raise Z3::Exception, "Cannot convert #{val.class} to #{self.class}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def True
|
22
|
+
from_const(true)
|
23
|
+
end
|
24
|
+
|
25
|
+
def False
|
26
|
+
from_const(false)
|
27
|
+
end
|
28
|
+
|
29
|
+
public_class_method :new
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Z3
|
2
|
+
class IntSort < Sort
|
3
|
+
def initialize
|
4
|
+
super LowLevel.mk_int_sort
|
5
|
+
end
|
6
|
+
|
7
|
+
def value_class
|
8
|
+
IntValue
|
9
|
+
end
|
10
|
+
|
11
|
+
def from_const(val)
|
12
|
+
if val.is_a?(Integer)
|
13
|
+
new(LowLevel.mk_numeral(val.to_s, self))
|
14
|
+
else
|
15
|
+
raise Z3::Exception, "Cannot convert #{val.class} to #{self.class}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
public_class_method :new
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Z3
|
2
|
+
class RealSort < Sort
|
3
|
+
def initialize
|
4
|
+
super LowLevel.mk_real_sort
|
5
|
+
end
|
6
|
+
|
7
|
+
def value_class
|
8
|
+
RealValue
|
9
|
+
end
|
10
|
+
|
11
|
+
def from_const(val)
|
12
|
+
if val.is_a?(Integer) or val.is_a?(Float)
|
13
|
+
new LowLevel.mk_numeral(val.to_s, self)
|
14
|
+
else
|
15
|
+
raise Z3::Exception, "Cannot convert #{val.class} to #{self.class}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def from_value(val)
|
20
|
+
if val.is_a?(IntValue)
|
21
|
+
new LowLevel.mk_int2real(val)
|
22
|
+
elsif val.is_a?(RealValue)
|
23
|
+
val
|
24
|
+
else
|
25
|
+
raise Z3::Exception, "Cannot convert #{val.class} to #{self.class}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def >(other)
|
30
|
+
raise ArgumentError unless other.is_a?(Sort)
|
31
|
+
other.is_a?(IntSort)
|
32
|
+
end
|
33
|
+
|
34
|
+
public_class_method :new
|
35
|
+
end
|
36
|
+
end
|
data/lib/z3/sort/sort.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
module Z3
|
2
|
+
class Sort
|
3
|
+
attr_reader :_sort
|
4
|
+
def initialize(_sort)
|
5
|
+
@_sort = _sort
|
6
|
+
end
|
7
|
+
|
8
|
+
include Comparable
|
9
|
+
def ==(other)
|
10
|
+
other.is_a?(Sort) and @_sort == other._sort
|
11
|
+
end
|
12
|
+
|
13
|
+
def >(other)
|
14
|
+
raise ArgumentError unless other.is_a?(Sort)
|
15
|
+
false
|
16
|
+
end
|
17
|
+
|
18
|
+
# Reimplementing Comparable
|
19
|
+
# Check if it can handle partial orders OK
|
20
|
+
def <(other)
|
21
|
+
raise ArgumentError unless other.is_a?(Sort)
|
22
|
+
other > self
|
23
|
+
end
|
24
|
+
|
25
|
+
def >=(other)
|
26
|
+
raise ArgumentError unless other.is_a?(Sort)
|
27
|
+
self == other or self > other
|
28
|
+
end
|
29
|
+
|
30
|
+
def <=(other)
|
31
|
+
raise ArgumentError unless other.is_a?(Sort)
|
32
|
+
other >= self
|
33
|
+
end
|
34
|
+
|
35
|
+
def <=>(other)
|
36
|
+
raise ArgumentError unless other.is_a?(Sort)
|
37
|
+
return 0 if self == other
|
38
|
+
return 1 if self > other
|
39
|
+
return -1 if other > self
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
LowLevel.sort_to_string(self)
|
45
|
+
end
|
46
|
+
|
47
|
+
def inspect
|
48
|
+
"#{self}Sort"
|
49
|
+
end
|
50
|
+
|
51
|
+
def var(name)
|
52
|
+
new(
|
53
|
+
Z3::LowLevel.mk_const(
|
54
|
+
Z3::LowLevel.mk_string_symbol(name),
|
55
|
+
self,
|
56
|
+
)
|
57
|
+
)
|
58
|
+
end
|
59
|
+
|
60
|
+
# We pretend to be a class, sort of
|
61
|
+
def new(_ast)
|
62
|
+
value_class.new(_ast, self)
|
63
|
+
end
|
64
|
+
|
65
|
+
def value_class
|
66
|
+
raise "SubclassResponsibility"
|
67
|
+
end
|
68
|
+
|
69
|
+
def from_value(v)
|
70
|
+
return v if v.sort == self
|
71
|
+
raise Z3::Exception, "Can't convert #{v.sort} into #{self}"
|
72
|
+
end
|
73
|
+
|
74
|
+
private_class_method :new
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Z3
|
2
|
+
# IntValue / RealValue
|
3
|
+
module ArithValue
|
4
|
+
def +(other)
|
5
|
+
::Z3.Add(self, other)
|
6
|
+
end
|
7
|
+
|
8
|
+
def -(other)
|
9
|
+
::Z3.Sub(self, other)
|
10
|
+
end
|
11
|
+
|
12
|
+
def *(other)
|
13
|
+
::Z3.Mul(self, other)
|
14
|
+
end
|
15
|
+
|
16
|
+
def /(other)
|
17
|
+
::Z3.Div(self, other)
|
18
|
+
end
|
19
|
+
|
20
|
+
def **(other)
|
21
|
+
::Z3.Power(self, other)
|
22
|
+
end
|
23
|
+
|
24
|
+
def >(other)
|
25
|
+
::Z3.Gt(self, other)
|
26
|
+
end
|
27
|
+
|
28
|
+
def >=(other)
|
29
|
+
::Z3.Ge(self, other)
|
30
|
+
end
|
31
|
+
|
32
|
+
def <=(other)
|
33
|
+
::Z3.Le(self, other)
|
34
|
+
end
|
35
|
+
|
36
|
+
def <(other)
|
37
|
+
::Z3.Lt(self, other)
|
38
|
+
end
|
39
|
+
|
40
|
+
def -@
|
41
|
+
sort.new(LowLevel.mk_unary_minus(self))
|
42
|
+
end
|
43
|
+
|
44
|
+
# Recast so 1 + x:Float
|
45
|
+
# is: (+ 1.0 x)
|
46
|
+
# not: (+ (to_real 1) x)
|
47
|
+
def coerce(other)
|
48
|
+
other_sort = Value.sort_for_const(other)
|
49
|
+
max_sort = [sort, other_sort].max
|
50
|
+
[max_sort.from_const(other), max_sort.from_value(self)]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Z3
|
2
|
+
class BitvecValue < Value
|
3
|
+
def ~
|
4
|
+
sort.new(LowLevel.mk_bvnot(self))
|
5
|
+
end
|
6
|
+
|
7
|
+
def -@
|
8
|
+
sort.new(LowLevel.mk_bvneg(self))
|
9
|
+
end
|
10
|
+
|
11
|
+
def &(other)
|
12
|
+
Z3.And(self, other)
|
13
|
+
end
|
14
|
+
|
15
|
+
def |(other)
|
16
|
+
Z3.Or(self, other)
|
17
|
+
end
|
18
|
+
|
19
|
+
def ^(other)
|
20
|
+
Z3.Xor(self, other)
|
21
|
+
end
|
22
|
+
|
23
|
+
def +(other)
|
24
|
+
::Z3.Add(self, other)
|
25
|
+
end
|
26
|
+
|
27
|
+
def -(other)
|
28
|
+
::Z3.Sub(self, other)
|
29
|
+
end
|
30
|
+
|
31
|
+
def *(other)
|
32
|
+
::Z3.Mul(self, other)
|
33
|
+
end
|
34
|
+
|
35
|
+
def >>(other)
|
36
|
+
Z3.RShift(self, other)
|
37
|
+
end
|
38
|
+
|
39
|
+
def <<(other)
|
40
|
+
Z3.LShift(self, other)
|
41
|
+
end
|
42
|
+
|
43
|
+
def >(other)
|
44
|
+
::Z3.Gt(self, other)
|
45
|
+
end
|
46
|
+
|
47
|
+
def >=(other)
|
48
|
+
::Z3.Ge(self, other)
|
49
|
+
end
|
50
|
+
|
51
|
+
def <=(other)
|
52
|
+
::Z3.Le(self, other)
|
53
|
+
end
|
54
|
+
|
55
|
+
def <(other)
|
56
|
+
::Z3.Lt(self, other)
|
57
|
+
end
|
58
|
+
|
59
|
+
def coerce(other)
|
60
|
+
other_sort = Value.sort_for_const(other)
|
61
|
+
max_sort = [sort, other_sort].max
|
62
|
+
[max_sort.from_const(other), max_sort.from_value(self)]
|
63
|
+
end
|
64
|
+
|
65
|
+
public_class_method :new
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Z3
|
2
|
+
class BoolValue < Value
|
3
|
+
def ~
|
4
|
+
sort.new(LowLevel.mk_not(self))
|
5
|
+
end
|
6
|
+
|
7
|
+
def &(other)
|
8
|
+
Z3.And(self, other)
|
9
|
+
end
|
10
|
+
|
11
|
+
def |(other)
|
12
|
+
Z3.Or(self, other)
|
13
|
+
end
|
14
|
+
|
15
|
+
def ^(other)
|
16
|
+
Z3.Xor(self, other)
|
17
|
+
end
|
18
|
+
|
19
|
+
def iff(other)
|
20
|
+
Z3.Iff(self, other)
|
21
|
+
end
|
22
|
+
|
23
|
+
def implies(other)
|
24
|
+
Z3.Implies(self, other)
|
25
|
+
end
|
26
|
+
|
27
|
+
public_class_method :new
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Z3
|
2
|
+
class Value
|
3
|
+
attr_reader :_ast, :sort
|
4
|
+
def initialize(_ast, sort)
|
5
|
+
@_ast = _ast
|
6
|
+
@sort = sort
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_s
|
10
|
+
Z3::LowLevel.ast_to_string(self)
|
11
|
+
end
|
12
|
+
|
13
|
+
def inspect
|
14
|
+
"Value<#{to_s} :: #{sort.to_s}>"
|
15
|
+
end
|
16
|
+
|
17
|
+
def ==(other)
|
18
|
+
::Z3.Eq(self, other)
|
19
|
+
end
|
20
|
+
|
21
|
+
def !=(other)
|
22
|
+
::Z3.Distinct(self, other)
|
23
|
+
end
|
24
|
+
|
25
|
+
private_class_method :new
|
26
|
+
|
27
|
+
class << self
|
28
|
+
def sort_for_const(a)
|
29
|
+
case a
|
30
|
+
when TrueClass, FalseClass
|
31
|
+
BoolSort.new
|
32
|
+
when Integer
|
33
|
+
IntSort.new
|
34
|
+
when Float
|
35
|
+
RealSort.new
|
36
|
+
else
|
37
|
+
raise Z3::Exception, "No idea how to autoconvert `#{a.class}': `#{a.inspect}'"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def new_from_pointer(_ast)
|
42
|
+
_txt = Z3::VeryLowLevel.Z3_ast_to_string(Z3::LowLevel._ctx_pointer, _ast)
|
43
|
+
# raise "No idea how to convert this value"
|
44
|
+
# if == Z3::LowLevel.mk_bool_sort
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/z3/very_low_level.rb
CHANGED
@@ -5,53 +5,36 @@ require 'ffi'
|
|
5
5
|
module Z3::VeryLowLevel
|
6
6
|
extend FFI::Library
|
7
7
|
ffi_lib "z3"
|
8
|
-
# Aliases defined just to make APIs below look nicer
|
9
|
-
ast_pointer = :pointer
|
10
|
-
ctx_pointer = :pointer
|
11
|
-
fixedpoint_pointer = :pointer
|
12
|
-
func_decl_pointer = :pointer
|
13
|
-
goal_pointer = :pointer
|
14
|
-
model_pointer = :pointer
|
15
|
-
optimize_pointer = :pointer
|
16
|
-
param_descrs_pointer = :pointer
|
17
|
-
params_pointer = :pointer
|
18
|
-
pattern_pointer = :pointer
|
19
|
-
probe_pointer = :pointer
|
20
|
-
solver_pointer = :pointer
|
21
|
-
sort_pointer = :pointer
|
22
|
-
symbol_pointer = :pointer
|
23
|
-
tactic_pointer = :pointer
|
24
|
-
rcf_num_pointer = :pointer
|
25
|
-
stats_pointer = :pointer
|
26
|
-
app_pointer = :pointer
|
27
|
-
apply_result_pointer = :pointer
|
28
|
-
ast_map_pointer = :pointer
|
29
|
-
ast_vector_pointer = :pointer
|
30
|
-
config_pointer = :pointer
|
31
|
-
constructor_pointer = :pointer
|
32
|
-
constructor_list_pointer = :pointer
|
33
|
-
func_entry_pointer = :pointer
|
34
|
-
func_interp_pointer = :pointer
|
35
8
|
|
9
|
+
class << self
|
10
|
+
# Aliases defined just to make APIs below look nicer
|
11
|
+
def attach_function(name, arg_types, return_type)
|
36
12
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
attach_function :Z3_mk_context, [], ctx_pointer
|
42
|
-
attach_function :Z3_model_eval, [ctx_pointer, model_pointer, ast_pointer, :bool, :pointer], :int
|
43
|
-
|
44
|
-
# attach_function :Z3_model_get_const_decl, [ctx_pointer, model_pointer, :int], func_decl_pointer
|
45
|
-
# attach_function :Z3_model_get_const_interp, [ctx_pointer, model_pointer, func_decl_pointer], ast_pointer
|
46
|
-
# attach_function :Z3_get_decl_name, [ctx_pointer, func_decl_pointer], symbol_pointer
|
13
|
+
arg_types = arg_types.map{|t| map_type(t)}
|
14
|
+
return_type = map_type(return_type)
|
15
|
+
super(name, arg_types, return_type)
|
16
|
+
end
|
47
17
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
18
|
+
def map_type(t)
|
19
|
+
if t.to_s =~ /\A(.*)_pointer\z/
|
20
|
+
:pointer
|
21
|
+
else
|
22
|
+
t
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
54
26
|
|
55
|
-
###
|
56
|
-
|
27
|
+
### Manually added functions gen_api can't handle [yet]
|
28
|
+
# callback :error_handler, [:ctx_pointer, :int], :void
|
29
|
+
callback :error_handler, [:pointer, :int], :void
|
30
|
+
attach_function :Z3_get_version, [:pointer, :pointer, :pointer, :pointer], :void
|
31
|
+
attach_function :Z3_set_error_handler, [:ctx_pointer, :error_handler], :void
|
32
|
+
attach_function :Z3_mk_context, [], :ctx_pointer
|
33
|
+
attach_function :Z3_model_eval, [:ctx_pointer, :model_pointer, :ast_pointer, :bool, :pointer], :int
|
34
|
+
attach_function :Z3_mk_and, [:ctx_pointer, :int, :pointer], :ast_pointer
|
35
|
+
attach_function :Z3_mk_or, [:ctx_pointer, :int, :pointer], :ast_pointer
|
36
|
+
attach_function :Z3_mk_add, [:ctx_pointer, :int, :pointer], :ast_pointer
|
37
|
+
attach_function :Z3_mk_sub, [:ctx_pointer, :int, :pointer], :ast_pointer
|
38
|
+
attach_function :Z3_mk_mul, [:ctx_pointer, :int, :pointer], :ast_pointer
|
39
|
+
attach_function :Z3_mk_distinct, [:ctx_pointer, :int, :pointer], :ast_pointer
|
57
40
|
end
|