z3 0.0.20180629 → 0.0.20220203
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 +4 -4
- data/README.md +2 -4
- data/Rakefile +15 -8
- data/examples/abc_path +187 -0
- data/examples/abc_path-1.txt +7 -0
- data/examples/algebra_problems +12 -12
- data/examples/aquarium +133 -0
- data/examples/aquarium-1.txt +11 -0
- data/examples/bridges +2 -2
- data/examples/cats_organized_neatly +133 -0
- data/examples/cats_organized_neatly-10.txt +15 -0
- data/examples/cats_organized_neatly-3.txt +8 -0
- data/examples/cats_organized_neatly-48.txt +32 -0
- data/examples/circuit_problems +4 -4
- data/examples/clogic_puzzle +2 -2
- data/examples/color_nonogram +150 -0
- data/examples/color_nonogram-1.txt +23 -0
- data/examples/crossflip +2 -4
- data/examples/dominion +153 -0
- data/examples/dominion-1.txt +8 -0
- data/examples/dominosa +133 -0
- data/examples/dominosa-1.txt +8 -0
- data/examples/eulero +99 -0
- data/examples/eulero-1.txt +5 -0
- data/examples/four_hackers_puzzle +2 -2
- data/examples/futoshiki +128 -0
- data/examples/futoshiki-1.txt +17 -0
- data/examples/kakurasu +73 -0
- data/examples/kakurasu-1.txt +2 -0
- data/examples/kakuro +2 -2
- data/examples/killer_sudoku +88 -0
- data/examples/killer_sudoku-1.txt +17 -0
- data/examples/killer_sudoku-2.txt +53 -0
- data/examples/kinematics_problems +20 -20
- data/examples/knights_puzzle +2 -2
- data/examples/kropki +100 -0
- data/examples/kropki-1.txt +13 -0
- data/examples/letter_connections +2 -2
- data/examples/light_up +2 -2
- data/examples/minisudoku +2 -2
- data/examples/miracle_sudoku +135 -0
- data/examples/miracle_sudoku-1.txt +9 -0
- data/examples/mortal_coil_puzzle +2 -2
- data/examples/nanro +245 -0
- data/examples/nanro-1.txt +8 -0
- data/examples/nine_clocks +106 -0
- data/examples/nonogram +2 -2
- data/examples/pyramid_nonogram +2 -2
- data/examples/regexp_crossword_solver +2 -2
- data/examples/regexp_solver +2 -2
- data/examples/renzoku +124 -0
- data/examples/renzoku-1.txt +17 -0
- data/examples/sandwich_sudoku +101 -0
- data/examples/sandwich_sudoku-1.txt +10 -0
- data/examples/selfref +2 -2
- data/examples/simple_regexp_parser.rb +58 -56
- data/examples/skyscrapers +118 -0
- data/examples/skyscrapers-1.txt +6 -0
- data/examples/skyscrapers-2.txt +11 -0
- data/examples/star_battle +134 -0
- data/examples/star_battle-1.txt +10 -0
- data/examples/stitches +180 -0
- data/examples/stitches-1.txt +11 -0
- data/examples/sudoku +2 -2
- data/examples/suguru +199 -0
- data/examples/suguru-1.txt +17 -0
- data/examples/verbal_arithmetic +2 -2
- data/examples/yajilin +268 -0
- data/examples/yajilin-1.txt +10 -0
- data/lib/z3/ast.rb +8 -0
- data/lib/z3/expr/expr.rb +16 -15
- data/lib/z3/low_level.rb +6 -2
- data/lib/z3/low_level_auto.rb +180 -36
- data/lib/z3/optimize.rb +4 -4
- data/lib/z3/very_low_level.rb +8 -5
- data/lib/z3/very_low_level_auto.rb +45 -9
- data/spec/expr_spec.rb +62 -0
- data/spec/integration/abc_path_spec.rb +21 -0
- data/spec/integration/aquarium_spec.rb +27 -0
- data/spec/integration/cats_organized_neatly_spec.rb +14 -0
- data/spec/integration/color_nonogram_spec.rb +28 -0
- data/spec/integration/dominion_spec.rb +14 -0
- data/spec/integration/dominosa_spec.rb +21 -0
- data/spec/integration/eulero_spec.rb +11 -0
- data/spec/integration/futoshiki_spec.rb +23 -0
- data/spec/integration/kakurasu_spec.rb +18 -0
- data/spec/integration/killer_sudoku_spec.rb +10 -0
- data/spec/integration/knights_puzzle_spec.rb +11 -11
- data/spec/integration/kropki_spec.rb +19 -0
- data/spec/integration/miracle_sudoku_spec.rb +15 -0
- data/spec/integration/mortal_coil_puzzle_spec.rb +8 -6
- data/spec/integration/nanro_spec.rb +39 -0
- data/spec/integration/nine_clocks_spec.rb +30 -0
- data/spec/integration/oneofus_spec.rb +7 -15
- data/spec/integration/regexp_crossword_solver_spec.rb +1 -1
- data/spec/integration/renzoku_spec.rb +23 -0
- data/spec/integration/sandwich_sudoku_spec.rb +15 -0
- data/spec/integration/skyscraper_spec.rb +10 -0
- data/spec/integration/star_battle_spec.rb +27 -0
- data/spec/integration/stitches_spec.rb +25 -0
- data/spec/integration/suguru_spec.rb +23 -0
- data/spec/integration/yajilin_spec.rb +25 -0
- data/spec/optimize_spec.rb +6 -4
- data/spec/set_expr_spec.rb +14 -8
- data/spec/solver_spec.rb +4 -5
- data/spec/spec_helper.rb +15 -0
- metadata +105 -25
data/lib/z3/ast.rb
CHANGED
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
|
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,11 +111,11 @@ 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
|
117
|
-
raise Z3::Exception, "Can't perform logic operations on #{
|
118
|
+
raise Z3::Exception, "Can't perform logic operations on #{args[0].sort} exprs, only Bool and Bitvec"
|
118
119
|
end
|
119
120
|
end
|
120
121
|
|
@@ -124,11 +125,11 @@ 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
|
131
|
-
raise Z3::Exception, "Can't perform logic operations on #{
|
132
|
+
raise Z3::Exception, "Can't perform logic operations on #{args[0].sort} exprs, only Bool and Bitvec"
|
132
133
|
end
|
133
134
|
end
|
134
135
|
|
@@ -136,15 +137,15 @@ 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
|
147
|
-
raise Z3::Exception, "Can't perform logic operations on #{
|
148
|
+
raise Z3::Exception, "Can't perform logic operations on #{args[0].sort} exprs, only Bool and Bitvec"
|
148
149
|
end
|
149
150
|
end
|
150
151
|
|
@@ -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
|
data/lib/z3/low_level_auto.rb
CHANGED
@@ -25,6 +25,14 @@ module Z3
|
|
25
25
|
VeryLowLevel.Z3_algebraic_ge(_ctx_pointer, ast1._ast, ast2._ast)
|
26
26
|
end
|
27
27
|
|
28
|
+
def algebraic_get_i(ast) #=> :uint
|
29
|
+
VeryLowLevel.Z3_algebraic_get_i(_ctx_pointer, ast._ast)
|
30
|
+
end
|
31
|
+
|
32
|
+
def algebraic_get_poly(ast) #=> :ast_vector_pointer
|
33
|
+
VeryLowLevel.Z3_algebraic_get_poly(_ctx_pointer, ast._ast)
|
34
|
+
end
|
35
|
+
|
28
36
|
def algebraic_gt(ast1, ast2) #=> :bool
|
29
37
|
VeryLowLevel.Z3_algebraic_gt(_ctx_pointer, ast1._ast, ast2._ast)
|
30
38
|
end
|
@@ -77,10 +85,6 @@ module Z3
|
|
77
85
|
VeryLowLevel.Z3_algebraic_sub(_ctx_pointer, ast1._ast, ast2._ast)
|
78
86
|
end
|
79
87
|
|
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
88
|
def apply_result_dec_ref(apply_result) #=> :void
|
85
89
|
VeryLowLevel.Z3_apply_result_dec_ref(_ctx_pointer, apply_result._apply_result)
|
86
90
|
end
|
@@ -213,6 +217,10 @@ module Z3
|
|
213
217
|
VeryLowLevel.Z3_enable_trace(str)
|
214
218
|
end
|
215
219
|
|
220
|
+
def eval_smtlib2_string(str) #=> :string
|
221
|
+
VeryLowLevel.Z3_eval_smtlib2_string(_ctx_pointer, str)
|
222
|
+
end
|
223
|
+
|
216
224
|
def finalize_memory #=> :void
|
217
225
|
VeryLowLevel.Z3_finalize_memory()
|
218
226
|
end
|
@@ -301,14 +309,6 @@ module Z3
|
|
301
309
|
VeryLowLevel.Z3_fixedpoint_inc_ref(_ctx_pointer, fixedpoint._fixedpoint)
|
302
310
|
end
|
303
311
|
|
304
|
-
def fixedpoint_pop(fixedpoint) #=> :void
|
305
|
-
VeryLowLevel.Z3_fixedpoint_pop(_ctx_pointer, fixedpoint._fixedpoint)
|
306
|
-
end
|
307
|
-
|
308
|
-
def fixedpoint_push(fixedpoint) #=> :void
|
309
|
-
VeryLowLevel.Z3_fixedpoint_push(_ctx_pointer, fixedpoint._fixedpoint)
|
310
|
-
end
|
311
|
-
|
312
312
|
def fixedpoint_query(fixedpoint, ast) #=> :int
|
313
313
|
VeryLowLevel.Z3_fixedpoint_query(_ctx_pointer, fixedpoint._fixedpoint, ast._ast)
|
314
314
|
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
|
@@ -593,10 +589,18 @@ module Z3
|
|
593
589
|
VeryLowLevel.Z3_get_num_tactics(_ctx_pointer)
|
594
590
|
end
|
595
591
|
|
592
|
+
def get_numeral_binary_string(ast) #=> :string
|
593
|
+
VeryLowLevel.Z3_get_numeral_binary_string(_ctx_pointer, ast._ast)
|
594
|
+
end
|
595
|
+
|
596
596
|
def get_numeral_decimal_string(ast, num) #=> :string
|
597
597
|
VeryLowLevel.Z3_get_numeral_decimal_string(_ctx_pointer, ast._ast, num)
|
598
598
|
end
|
599
599
|
|
600
|
+
def get_numeral_double(ast) #=> :double
|
601
|
+
VeryLowLevel.Z3_get_numeral_double(_ctx_pointer, ast._ast)
|
602
|
+
end
|
603
|
+
|
600
604
|
def get_numeral_string(ast) #=> :string
|
601
605
|
VeryLowLevel.Z3_get_numeral_string(_ctx_pointer, ast._ast)
|
602
606
|
end
|
@@ -605,10 +609,6 @@ module Z3
|
|
605
609
|
VeryLowLevel.Z3_get_numerator(_ctx_pointer, ast._ast)
|
606
610
|
end
|
607
611
|
|
608
|
-
def get_parser_error #=> :string
|
609
|
-
VeryLowLevel.Z3_get_parser_error(_ctx_pointer)
|
610
|
-
end
|
611
|
-
|
612
612
|
def get_pattern(pattern, num) #=> :ast_pointer
|
613
613
|
VeryLowLevel.Z3_get_pattern(_ctx_pointer, pattern._ast, num)
|
614
614
|
end
|
@@ -661,6 +661,10 @@ module Z3
|
|
661
661
|
VeryLowLevel.Z3_get_range(_ctx_pointer, func_decl._ast)
|
662
662
|
end
|
663
663
|
|
664
|
+
def get_re_sort_basis(sort) #=> :sort_pointer
|
665
|
+
VeryLowLevel.Z3_get_re_sort_basis(_ctx_pointer, sort._ast)
|
666
|
+
end
|
667
|
+
|
664
668
|
def get_relation_arity(sort) #=> :uint
|
665
669
|
VeryLowLevel.Z3_get_relation_arity(_ctx_pointer, sort._ast)
|
666
670
|
end
|
@@ -669,6 +673,10 @@ module Z3
|
|
669
673
|
VeryLowLevel.Z3_get_relation_column(_ctx_pointer, sort._ast, num)
|
670
674
|
end
|
671
675
|
|
676
|
+
def get_seq_sort_basis(sort) #=> :sort_pointer
|
677
|
+
VeryLowLevel.Z3_get_seq_sort_basis(_ctx_pointer, sort._ast)
|
678
|
+
end
|
679
|
+
|
672
680
|
def get_sort(ast) #=> :sort_pointer
|
673
681
|
VeryLowLevel.Z3_get_sort(_ctx_pointer, ast._ast)
|
674
682
|
end
|
@@ -685,6 +693,10 @@ module Z3
|
|
685
693
|
VeryLowLevel.Z3_get_sort_name(_ctx_pointer, sort._ast)
|
686
694
|
end
|
687
695
|
|
696
|
+
def get_string_length(ast) #=> :uint
|
697
|
+
VeryLowLevel.Z3_get_string_length(_ctx_pointer, ast._ast)
|
698
|
+
end
|
699
|
+
|
688
700
|
def get_symbol_int(sym) #=> :int
|
689
701
|
VeryLowLevel.Z3_get_symbol_int(_ctx_pointer, sym)
|
690
702
|
end
|
@@ -725,6 +737,10 @@ module Z3
|
|
725
737
|
VeryLowLevel.Z3_goal_assert(_ctx_pointer, goal._goal, ast._ast)
|
726
738
|
end
|
727
739
|
|
740
|
+
def goal_convert_model(goal, model) #=> :model_pointer
|
741
|
+
VeryLowLevel.Z3_goal_convert_model(_ctx_pointer, goal._goal, model._model)
|
742
|
+
end
|
743
|
+
|
728
744
|
def goal_dec_ref(goal) #=> :void
|
729
745
|
VeryLowLevel.Z3_goal_dec_ref(_ctx_pointer, goal._goal)
|
730
746
|
end
|
@@ -769,6 +785,10 @@ module Z3
|
|
769
785
|
VeryLowLevel.Z3_goal_size(_ctx_pointer, goal._goal)
|
770
786
|
end
|
771
787
|
|
788
|
+
def goal_to_dimacs_string(goal, bool) #=> :string
|
789
|
+
VeryLowLevel.Z3_goal_to_dimacs_string(_ctx_pointer, goal._goal, bool)
|
790
|
+
end
|
791
|
+
|
772
792
|
def goal_to_string(goal) #=> :string
|
773
793
|
VeryLowLevel.Z3_goal_to_string(_ctx_pointer, goal._goal)
|
774
794
|
end
|
@@ -781,10 +801,6 @@ module Z3
|
|
781
801
|
VeryLowLevel.Z3_inc_ref(_ctx_pointer, ast._ast)
|
782
802
|
end
|
783
803
|
|
784
|
-
def interpolation_profile #=> :string
|
785
|
-
VeryLowLevel.Z3_interpolation_profile(_ctx_pointer)
|
786
|
-
end
|
787
|
-
|
788
804
|
def interrupt #=> :void
|
789
805
|
VeryLowLevel.Z3_interrupt(_ctx_pointer)
|
790
806
|
end
|
@@ -801,6 +817,10 @@ module Z3
|
|
801
817
|
VeryLowLevel.Z3_is_as_array(_ctx_pointer, ast._ast)
|
802
818
|
end
|
803
819
|
|
820
|
+
def is_char_sort(sort) #=> :bool
|
821
|
+
VeryLowLevel.Z3_is_char_sort(_ctx_pointer, sort._ast)
|
822
|
+
end
|
823
|
+
|
804
824
|
def is_eq_ast(ast1, ast2) #=> :bool
|
805
825
|
VeryLowLevel.Z3_is_eq_ast(_ctx_pointer, ast1._ast, ast2._ast)
|
806
826
|
end
|
@@ -813,10 +833,18 @@ module Z3
|
|
813
833
|
VeryLowLevel.Z3_is_eq_sort(_ctx_pointer, sort1._ast, sort2._ast)
|
814
834
|
end
|
815
835
|
|
836
|
+
def is_lambda(ast) #=> :bool
|
837
|
+
VeryLowLevel.Z3_is_lambda(_ctx_pointer, ast._ast)
|
838
|
+
end
|
839
|
+
|
816
840
|
def is_numeral_ast(ast) #=> :bool
|
817
841
|
VeryLowLevel.Z3_is_numeral_ast(_ctx_pointer, ast._ast)
|
818
842
|
end
|
819
843
|
|
844
|
+
def is_quantifier_exists(ast) #=> :bool
|
845
|
+
VeryLowLevel.Z3_is_quantifier_exists(_ctx_pointer, ast._ast)
|
846
|
+
end
|
847
|
+
|
820
848
|
def is_quantifier_forall(ast) #=> :bool
|
821
849
|
VeryLowLevel.Z3_is_quantifier_forall(_ctx_pointer, ast._ast)
|
822
850
|
end
|
@@ -1009,6 +1037,30 @@ module Z3
|
|
1009
1037
|
VeryLowLevel.Z3_mk_bvxor(_ctx_pointer, ast1._ast, ast2._ast)
|
1010
1038
|
end
|
1011
1039
|
|
1040
|
+
def mk_char_from_bv(ast) #=> :ast_pointer
|
1041
|
+
VeryLowLevel.Z3_mk_char_from_bv(_ctx_pointer, ast._ast)
|
1042
|
+
end
|
1043
|
+
|
1044
|
+
def mk_char_is_digit(ast) #=> :ast_pointer
|
1045
|
+
VeryLowLevel.Z3_mk_char_is_digit(_ctx_pointer, ast._ast)
|
1046
|
+
end
|
1047
|
+
|
1048
|
+
def mk_char_le(ast1, ast2) #=> :ast_pointer
|
1049
|
+
VeryLowLevel.Z3_mk_char_le(_ctx_pointer, ast1._ast, ast2._ast)
|
1050
|
+
end
|
1051
|
+
|
1052
|
+
def mk_char_sort #=> :sort_pointer
|
1053
|
+
VeryLowLevel.Z3_mk_char_sort(_ctx_pointer)
|
1054
|
+
end
|
1055
|
+
|
1056
|
+
def mk_char_to_bv(ast) #=> :ast_pointer
|
1057
|
+
VeryLowLevel.Z3_mk_char_to_bv(_ctx_pointer, ast._ast)
|
1058
|
+
end
|
1059
|
+
|
1060
|
+
def mk_char_to_int(ast) #=> :ast_pointer
|
1061
|
+
VeryLowLevel.Z3_mk_char_to_int(_ctx_pointer, ast._ast)
|
1062
|
+
end
|
1063
|
+
|
1012
1064
|
def mk_concat(ast1, ast2) #=> :ast_pointer
|
1013
1065
|
VeryLowLevel.Z3_mk_concat(_ctx_pointer, ast1._ast, ast2._ast)
|
1014
1066
|
end
|
@@ -1033,6 +1085,10 @@ module Z3
|
|
1033
1085
|
VeryLowLevel.Z3_mk_div(_ctx_pointer, ast1._ast, ast2._ast)
|
1034
1086
|
end
|
1035
1087
|
|
1088
|
+
def mk_divides(ast1, ast2) #=> :ast_pointer
|
1089
|
+
VeryLowLevel.Z3_mk_divides(_ctx_pointer, ast1._ast, ast2._ast)
|
1090
|
+
end
|
1091
|
+
|
1036
1092
|
def mk_empty_set(sort) #=> :ast_pointer
|
1037
1093
|
VeryLowLevel.Z3_mk_empty_set(_ctx_pointer, sort._ast)
|
1038
1094
|
end
|
@@ -1349,14 +1405,6 @@ module Z3
|
|
1349
1405
|
VeryLowLevel.Z3_mk_int_to_str(_ctx_pointer, ast._ast)
|
1350
1406
|
end
|
1351
1407
|
|
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
1408
|
def mk_is_int(ast) #=> :ast_pointer
|
1361
1409
|
VeryLowLevel.Z3_mk_is_int(_ctx_pointer, ast._ast)
|
1362
1410
|
end
|
@@ -1369,6 +1417,14 @@ module Z3
|
|
1369
1417
|
VeryLowLevel.Z3_mk_le(_ctx_pointer, ast1._ast, ast2._ast)
|
1370
1418
|
end
|
1371
1419
|
|
1420
|
+
def mk_linear_order(sort, num) #=> :func_decl_pointer
|
1421
|
+
VeryLowLevel.Z3_mk_linear_order(_ctx_pointer, sort._ast, num)
|
1422
|
+
end
|
1423
|
+
|
1424
|
+
def mk_lstring(num, str) #=> :ast_pointer
|
1425
|
+
VeryLowLevel.Z3_mk_lstring(_ctx_pointer, num, str)
|
1426
|
+
end
|
1427
|
+
|
1372
1428
|
def mk_lt(ast1, ast2) #=> :ast_pointer
|
1373
1429
|
VeryLowLevel.Z3_mk_lt(_ctx_pointer, ast1._ast, ast2._ast)
|
1374
1430
|
end
|
@@ -1397,6 +1453,14 @@ module Z3
|
|
1397
1453
|
VeryLowLevel.Z3_mk_params(_ctx_pointer)
|
1398
1454
|
end
|
1399
1455
|
|
1456
|
+
def mk_partial_order(sort, num) #=> :func_decl_pointer
|
1457
|
+
VeryLowLevel.Z3_mk_partial_order(_ctx_pointer, sort._ast, num)
|
1458
|
+
end
|
1459
|
+
|
1460
|
+
def mk_piecewise_linear_order(sort, num) #=> :func_decl_pointer
|
1461
|
+
VeryLowLevel.Z3_mk_piecewise_linear_order(_ctx_pointer, sort._ast, num)
|
1462
|
+
end
|
1463
|
+
|
1400
1464
|
def mk_power(ast1, ast2) #=> :ast_pointer
|
1401
1465
|
VeryLowLevel.Z3_mk_power(_ctx_pointer, ast1._ast, ast2._ast)
|
1402
1466
|
end
|
@@ -1405,6 +1469,10 @@ module Z3
|
|
1405
1469
|
VeryLowLevel.Z3_mk_probe(_ctx_pointer, str)
|
1406
1470
|
end
|
1407
1471
|
|
1472
|
+
def mk_re_allchar(sort) #=> :ast_pointer
|
1473
|
+
VeryLowLevel.Z3_mk_re_allchar(_ctx_pointer, sort._ast)
|
1474
|
+
end
|
1475
|
+
|
1408
1476
|
def mk_re_complement(ast) #=> :ast_pointer
|
1409
1477
|
VeryLowLevel.Z3_mk_re_complement(_ctx_pointer, ast._ast)
|
1410
1478
|
end
|
@@ -1453,10 +1521,22 @@ module Z3
|
|
1453
1521
|
VeryLowLevel.Z3_mk_rotate_right(_ctx_pointer, num, ast._ast)
|
1454
1522
|
end
|
1455
1523
|
|
1524
|
+
def mk_sbv_to_str(ast) #=> :ast_pointer
|
1525
|
+
VeryLowLevel.Z3_mk_sbv_to_str(_ctx_pointer, ast._ast)
|
1526
|
+
end
|
1527
|
+
|
1456
1528
|
def mk_select(ast1, ast2) #=> :ast_pointer
|
1457
1529
|
VeryLowLevel.Z3_mk_select(_ctx_pointer, ast1._ast, ast2._ast)
|
1458
1530
|
end
|
1459
1531
|
|
1532
|
+
def mk_seq_last_index(ast1, ast2) #=> :ast_pointer
|
1533
|
+
VeryLowLevel.Z3_mk_seq_last_index(_ctx_pointer, ast1._ast, ast2._ast)
|
1534
|
+
end
|
1535
|
+
|
1536
|
+
def mk_seq_nth(ast1, ast2) #=> :ast_pointer
|
1537
|
+
VeryLowLevel.Z3_mk_seq_nth(_ctx_pointer, ast1._ast, ast2._ast)
|
1538
|
+
end
|
1539
|
+
|
1460
1540
|
def mk_set_add(ast1, ast2) #=> :ast_pointer
|
1461
1541
|
VeryLowLevel.Z3_mk_set_add(_ctx_pointer, ast1._ast, ast2._ast)
|
1462
1542
|
end
|
@@ -1473,6 +1553,10 @@ module Z3
|
|
1473
1553
|
VeryLowLevel.Z3_mk_set_difference(_ctx_pointer, ast1._ast, ast2._ast)
|
1474
1554
|
end
|
1475
1555
|
|
1556
|
+
def mk_set_has_size(ast1, ast2) #=> :ast_pointer
|
1557
|
+
VeryLowLevel.Z3_mk_set_has_size(_ctx_pointer, ast1._ast, ast2._ast)
|
1558
|
+
end
|
1559
|
+
|
1476
1560
|
def mk_set_member(ast1, ast2) #=> :ast_pointer
|
1477
1561
|
VeryLowLevel.Z3_mk_set_member(_ctx_pointer, ast1._ast, ast2._ast)
|
1478
1562
|
end
|
@@ -1509,6 +1593,14 @@ module Z3
|
|
1509
1593
|
VeryLowLevel.Z3_mk_store(_ctx_pointer, ast1._ast, ast2._ast, ast3._ast)
|
1510
1594
|
end
|
1511
1595
|
|
1596
|
+
def mk_str_le(ast1, ast2) #=> :ast_pointer
|
1597
|
+
VeryLowLevel.Z3_mk_str_le(_ctx_pointer, ast1._ast, ast2._ast)
|
1598
|
+
end
|
1599
|
+
|
1600
|
+
def mk_str_lt(ast1, ast2) #=> :ast_pointer
|
1601
|
+
VeryLowLevel.Z3_mk_str_lt(_ctx_pointer, ast1._ast, ast2._ast)
|
1602
|
+
end
|
1603
|
+
|
1512
1604
|
def mk_str_to_int(ast) #=> :ast_pointer
|
1513
1605
|
VeryLowLevel.Z3_mk_str_to_int(_ctx_pointer, ast._ast)
|
1514
1606
|
end
|
@@ -1521,10 +1613,22 @@ module Z3
|
|
1521
1613
|
VeryLowLevel.Z3_mk_tactic(_ctx_pointer, str)
|
1522
1614
|
end
|
1523
1615
|
|
1616
|
+
def mk_transitive_closure(func_decl) #=> :func_decl_pointer
|
1617
|
+
VeryLowLevel.Z3_mk_transitive_closure(_ctx_pointer, func_decl._ast)
|
1618
|
+
end
|
1619
|
+
|
1620
|
+
def mk_tree_order(sort, num) #=> :func_decl_pointer
|
1621
|
+
VeryLowLevel.Z3_mk_tree_order(_ctx_pointer, sort._ast, num)
|
1622
|
+
end
|
1623
|
+
|
1524
1624
|
def mk_true #=> :ast_pointer
|
1525
1625
|
VeryLowLevel.Z3_mk_true(_ctx_pointer)
|
1526
1626
|
end
|
1527
1627
|
|
1628
|
+
def mk_ubv_to_str(ast) #=> :ast_pointer
|
1629
|
+
VeryLowLevel.Z3_mk_ubv_to_str(_ctx_pointer, ast._ast)
|
1630
|
+
end
|
1631
|
+
|
1528
1632
|
def mk_unary_minus(ast) #=> :ast_pointer
|
1529
1633
|
VeryLowLevel.Z3_mk_unary_minus(_ctx_pointer, ast._ast)
|
1530
1634
|
end
|
@@ -1605,16 +1709,20 @@ module Z3
|
|
1605
1709
|
VeryLowLevel.Z3_model_to_string(_ctx_pointer, model._model)
|
1606
1710
|
end
|
1607
1711
|
|
1712
|
+
def model_translate(model, context) #=> :model_pointer
|
1713
|
+
VeryLowLevel.Z3_model_translate(_ctx_pointer, model._model, context._context)
|
1714
|
+
end
|
1715
|
+
|
1608
1716
|
def optimize_assert(optimize, ast) #=> :void
|
1609
1717
|
VeryLowLevel.Z3_optimize_assert(_ctx_pointer, optimize._optimize, ast._ast)
|
1610
1718
|
end
|
1611
1719
|
|
1612
|
-
def
|
1613
|
-
VeryLowLevel.
|
1720
|
+
def optimize_assert_and_track(optimize, ast1, ast2) #=> :void
|
1721
|
+
VeryLowLevel.Z3_optimize_assert_and_track(_ctx_pointer, optimize._optimize, ast1._ast, ast2._ast)
|
1614
1722
|
end
|
1615
1723
|
|
1616
|
-
def
|
1617
|
-
VeryLowLevel.
|
1724
|
+
def optimize_assert_soft(optimize, ast, str, sym) #=> :uint
|
1725
|
+
VeryLowLevel.Z3_optimize_assert_soft(_ctx_pointer, optimize._optimize, ast._ast, str, sym)
|
1618
1726
|
end
|
1619
1727
|
|
1620
1728
|
def optimize_dec_ref(optimize) #=> :void
|
@@ -1665,6 +1773,10 @@ module Z3
|
|
1665
1773
|
VeryLowLevel.Z3_optimize_get_statistics(_ctx_pointer, optimize._optimize)
|
1666
1774
|
end
|
1667
1775
|
|
1776
|
+
def optimize_get_unsat_core(optimize) #=> :ast_vector_pointer
|
1777
|
+
VeryLowLevel.Z3_optimize_get_unsat_core(_ctx_pointer, optimize._optimize)
|
1778
|
+
end
|
1779
|
+
|
1668
1780
|
def optimize_get_upper(optimize, num) #=> :ast_pointer
|
1669
1781
|
VeryLowLevel.Z3_optimize_get_upper(_ctx_pointer, optimize._optimize, num)
|
1670
1782
|
end
|
@@ -1941,6 +2053,10 @@ module Z3
|
|
1941
2053
|
VeryLowLevel.Z3_solver_check(_ctx_pointer, solver._solver)
|
1942
2054
|
end
|
1943
2055
|
|
2056
|
+
def solver_cube(solver, ast_vector, num) #=> :ast_vector_pointer
|
2057
|
+
VeryLowLevel.Z3_solver_cube(_ctx_pointer, solver._solver, ast_vector, num)
|
2058
|
+
end
|
2059
|
+
|
1944
2060
|
def solver_dec_ref(solver) #=> :void
|
1945
2061
|
VeryLowLevel.Z3_solver_dec_ref(_ctx_pointer, solver._solver)
|
1946
2062
|
end
|
@@ -1969,6 +2085,10 @@ module Z3
|
|
1969
2085
|
VeryLowLevel.Z3_solver_get_model(_ctx_pointer, solver._solver)
|
1970
2086
|
end
|
1971
2087
|
|
2088
|
+
def solver_get_non_units(solver) #=> :ast_vector_pointer
|
2089
|
+
VeryLowLevel.Z3_solver_get_non_units(_ctx_pointer, solver._solver)
|
2090
|
+
end
|
2091
|
+
|
1972
2092
|
def solver_get_num_scopes(solver) #=> :uint
|
1973
2093
|
VeryLowLevel.Z3_solver_get_num_scopes(_ctx_pointer, solver._solver)
|
1974
2094
|
end
|
@@ -1989,18 +2109,38 @@ module Z3
|
|
1989
2109
|
VeryLowLevel.Z3_solver_get_statistics(_ctx_pointer, solver._solver)
|
1990
2110
|
end
|
1991
2111
|
|
2112
|
+
def solver_get_trail(solver) #=> :ast_vector_pointer
|
2113
|
+
VeryLowLevel.Z3_solver_get_trail(_ctx_pointer, solver._solver)
|
2114
|
+
end
|
2115
|
+
|
2116
|
+
def solver_get_units(solver) #=> :ast_vector_pointer
|
2117
|
+
VeryLowLevel.Z3_solver_get_units(_ctx_pointer, solver._solver)
|
2118
|
+
end
|
2119
|
+
|
1992
2120
|
def solver_get_unsat_core(solver) #=> :ast_vector_pointer
|
1993
2121
|
VeryLowLevel.Z3_solver_get_unsat_core(_ctx_pointer, solver._solver)
|
1994
2122
|
end
|
1995
2123
|
|
2124
|
+
def solver_import_model_converter(solver1, solver2) #=> :void
|
2125
|
+
VeryLowLevel.Z3_solver_import_model_converter(_ctx_pointer, solver1._solver, solver2._solver)
|
2126
|
+
end
|
2127
|
+
|
1996
2128
|
def solver_inc_ref(solver) #=> :void
|
1997
2129
|
VeryLowLevel.Z3_solver_inc_ref(_ctx_pointer, solver._solver)
|
1998
2130
|
end
|
1999
2131
|
|
2132
|
+
def solver_interrupt(solver) #=> :void
|
2133
|
+
VeryLowLevel.Z3_solver_interrupt(_ctx_pointer, solver._solver)
|
2134
|
+
end
|
2135
|
+
|
2000
2136
|
def solver_pop(solver, num) #=> :void
|
2001
2137
|
VeryLowLevel.Z3_solver_pop(_ctx_pointer, solver._solver, num)
|
2002
2138
|
end
|
2003
2139
|
|
2140
|
+
def solver_propagate_register(solver, ast) #=> :uint
|
2141
|
+
VeryLowLevel.Z3_solver_propagate_register(_ctx_pointer, solver._solver, ast._ast)
|
2142
|
+
end
|
2143
|
+
|
2004
2144
|
def solver_push(solver) #=> :void
|
2005
2145
|
VeryLowLevel.Z3_solver_push(_ctx_pointer, solver._solver)
|
2006
2146
|
end
|
@@ -2013,6 +2153,10 @@ module Z3
|
|
2013
2153
|
VeryLowLevel.Z3_solver_set_params(_ctx_pointer, solver._solver, params._params)
|
2014
2154
|
end
|
2015
2155
|
|
2156
|
+
def solver_to_dimacs_string(solver, bool) #=> :string
|
2157
|
+
VeryLowLevel.Z3_solver_to_dimacs_string(_ctx_pointer, solver._solver, bool)
|
2158
|
+
end
|
2159
|
+
|
2016
2160
|
def solver_to_string(solver) #=> :string
|
2017
2161
|
VeryLowLevel.Z3_solver_to_string(_ctx_pointer, solver._solver)
|
2018
2162
|
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
|
data/lib/z3/very_low_level.rb
CHANGED
@@ -1,19 +1,21 @@
|
|
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
|
7
6
|
extend FFI::Library
|
8
|
-
ffi_lib "z3"
|
7
|
+
ffi_lib ["libz3.so.4.8", "libz3.so", "z3"]
|
9
8
|
|
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)
|
15
|
+
rescue FFI::NotFoundError
|
16
|
+
define_singleton_method(name) do |*args|
|
17
|
+
raise Z3::Exception, "Could not find #{name} in the Z3 library. It is likely that the Z3 library has wrong version."
|
18
|
+
end
|
17
19
|
end
|
18
20
|
|
19
21
|
def map_type(t)
|
@@ -40,5 +42,6 @@ module Z3
|
|
40
42
|
attach_function :Z3_mk_set_union, [:ctx_pointer, :int, :pointer], :ast_pointer
|
41
43
|
attach_function :Z3_mk_set_intersect, [:ctx_pointer, :int, :pointer], :ast_pointer
|
42
44
|
attach_function :Z3_mk_distinct, [:ctx_pointer, :int, :pointer], :ast_pointer
|
45
|
+
attach_function :Z3_optimize_check, [:ctx_pointer, :optimize_pointer, :int, :pointer], :int
|
43
46
|
end
|
44
47
|
end
|