Skip to content

Commit 48fc3d7

Browse files
add clause proof module, small improvements to bapa
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent 4d30639 commit 48fc3d7

36 files changed

+721
-249
lines changed

src/api/api_seq.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ extern "C" {
164164
return "";
165165
}
166166
std::string s = str.as_string();
167-
*length = static_cast<unsigned>(s.size());
168-
return mk_c(c)->mk_external_string(s.c_str(), s.size());
167+
*length = (unsigned)(s.size());
168+
return mk_c(c)->mk_external_string(s.c_str(), *length);
169169
Z3_CATCH_RETURN("");
170170
}
171171

src/ast/array_decl_plugin.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,14 @@ class array_util : public array_recognizers {
188188
return m_manager.mk_app(m_fid, OP_SELECT, 0, nullptr, num_args, args);
189189
}
190190

191+
app * mk_select(ptr_vector<expr> const& args) {
192+
return mk_select(args.size(), args.c_ptr());
193+
}
194+
195+
app * mk_select(expr_ref_vector const& args) {
196+
return mk_select(args.size(), args.c_ptr());
197+
}
198+
191199
app * mk_map(func_decl * f, unsigned num_args, expr * const * args) {
192200
parameter p(f);
193201
return m_manager.mk_app(m_fid, OP_ARRAY_MAP, 1, &p, num_args, args);
@@ -229,6 +237,10 @@ class array_util : public array_recognizers {
229237
return m_manager.mk_app(m_fid, OP_SET_HAS_SIZE, set, n);
230238
}
231239

240+
app* mk_card(expr* set) {
241+
return m_manager.mk_app(m_fid, OP_SET_CARD, set);
242+
}
243+
232244
func_decl * mk_array_ext(sort* domain, unsigned i);
233245

234246
sort * mk_array_sort(sort* dom, sort* range) { return mk_array_sort(1, &dom, range); }

src/ast/ast.cpp

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -738,7 +738,13 @@ basic_decl_plugin::basic_decl_plugin():
738738
m_iff_oeq_decl(nullptr),
739739
m_skolemize_decl(nullptr),
740740
m_mp_oeq_decl(nullptr),
741-
m_hyper_res_decl0(nullptr) {
741+
m_hyper_res_decl0(nullptr),
742+
m_assumption_add_decl(nullptr),
743+
m_lemma_add_decl(nullptr),
744+
m_th_assumption_add_decl(nullptr),
745+
m_th_lemma_add_decl(nullptr),
746+
m_redundant_del_decl(nullptr),
747+
m_clause_trail_decl(nullptr) {
742748
}
743749

744750
bool basic_decl_plugin::check_proof_sorts(basic_op_kind k, unsigned arity, sort * const * domain) const {
@@ -908,6 +914,12 @@ func_decl * basic_decl_plugin::mk_proof_decl(basic_op_kind k, unsigned num_paren
908914
case PR_MODUS_PONENS_OEQ: return mk_proof_decl("mp~", k, 2, m_mp_oeq_decl);
909915
case PR_TH_LEMMA: return mk_proof_decl("th-lemma", k, num_parents, m_th_lemma_decls);
910916
case PR_HYPER_RESOLVE: return mk_proof_decl("hyper-res", k, num_parents, m_hyper_res_decl0);
917+
case PR_ASSUMPTION_ADD: return mk_proof_decl("add-assume", k, num_parents, m_assumption_add_decl);
918+
case PR_LEMMA_ADD: return mk_proof_decl("add-lemma", k, num_parents, m_lemma_add_decl);
919+
case PR_TH_ASSUMPTION_ADD: return mk_proof_decl("add-th-assume", k, num_parents, m_th_assumption_add_decl);
920+
case PR_TH_LEMMA_ADD: return mk_proof_decl("add-th-lemma", k, num_parents, m_th_lemma_add_decl);
921+
case PR_REDUNDANT_DEL: return mk_proof_decl("del-redundant", k, num_parents, m_redundant_del_decl);
922+
case PR_CLAUSE_TRAIL: return mk_proof_decl("proof-trail", k, num_parents, m_clause_trail_decl);
911923
default:
912924
UNREACHABLE();
913925
return nullptr;
@@ -1023,6 +1035,12 @@ void basic_decl_plugin::finalize() {
10231035
DEC_REF(m_iff_oeq_decl);
10241036
DEC_REF(m_skolemize_decl);
10251037
DEC_REF(m_mp_oeq_decl);
1038+
DEC_REF(m_assumption_add_decl);
1039+
DEC_REF(m_lemma_add_decl);
1040+
DEC_REF(m_th_assumption_add_decl);
1041+
DEC_REF(m_th_lemma_add_decl);
1042+
DEC_REF(m_redundant_del_decl);
1043+
DEC_REF(m_clause_trail_decl);
10261044
DEC_ARRAY_REF(m_apply_def_decls);
10271045
DEC_ARRAY_REF(m_nnf_pos_decls);
10281046
DEC_ARRAY_REF(m_nnf_neg_decls);
@@ -3277,6 +3295,39 @@ proof * ast_manager::mk_not_or_elim(proof * p, unsigned i) {
32773295
return mk_app(m_basic_family_id, PR_NOT_OR_ELIM, p, f);
32783296
}
32793297

3298+
proof* ast_manager::mk_clause_trail_elem(proof *pr, expr* e, decl_kind k) {
3299+
ptr_buffer<expr> args;
3300+
if (pr) args.push_back(pr);
3301+
args.push_back(e);
3302+
return mk_app(m_basic_family_id, k, 0, nullptr, args.size(), args.c_ptr());
3303+
}
3304+
3305+
proof * ast_manager::mk_assumption_add(proof* pr, expr* e) {
3306+
return mk_clause_trail_elem(pr, e, PR_ASSUMPTION_ADD);
3307+
}
3308+
3309+
proof * ast_manager::mk_lemma_add(proof* pr, expr* e) {
3310+
return mk_clause_trail_elem(pr, e, PR_LEMMA_ADD);
3311+
}
3312+
3313+
proof * ast_manager::mk_th_assumption_add(proof* pr, expr* e) {
3314+
return mk_clause_trail_elem(pr, e, PR_TH_ASSUMPTION_ADD);
3315+
}
3316+
3317+
proof * ast_manager::mk_th_lemma_add(proof* pr, expr* e) {
3318+
return mk_clause_trail_elem(pr, e, PR_TH_LEMMA_ADD);
3319+
}
3320+
3321+
proof * ast_manager::mk_redundant_del(expr* e) {
3322+
return mk_clause_trail_elem(nullptr, e, PR_REDUNDANT_DEL);
3323+
}
3324+
3325+
proof * ast_manager::mk_clause_trail(unsigned n, proof* const* ps) {
3326+
ptr_buffer<expr> args;
3327+
args.append(n, (expr**) ps);
3328+
args.push_back(mk_false());
3329+
return mk_app(m_basic_family_id, PR_CLAUSE_TRAIL, 0, nullptr, args.size(), args.c_ptr());
3330+
}
32803331

32813332
proof * ast_manager::mk_th_lemma(
32823333
family_id tid,

src/ast/ast.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Revision History:
1919
#ifndef AST_H_
2020
#define AST_H_
2121

22+
2223
#include "util/vector.h"
2324
#include "util/hashtable.h"
2425
#include "util/buffer.h"
@@ -1105,6 +1106,8 @@ enum basic_op_kind {
11051106

11061107
PR_HYPOTHESIS, PR_LEMMA, PR_UNIT_RESOLUTION, PR_IFF_TRUE, PR_IFF_FALSE, PR_COMMUTATIVITY, PR_DEF_AXIOM,
11071108

1109+
PR_ASSUMPTION_ADD, PR_TH_ASSUMPTION_ADD, PR_LEMMA_ADD, PR_TH_LEMMA_ADD, PR_REDUNDANT_DEL, PR_CLAUSE_TRAIL,
1110+
11081111
PR_DEF_INTRO, PR_APPLY_DEF, PR_IFF_OEQ, PR_NNF_POS, PR_NNF_NEG, PR_SKOLEMIZE,
11091112
PR_MODUS_PONENS_OEQ, PR_TH_LEMMA, PR_HYPER_RESOLVE, LAST_BASIC_PR
11101113
};
@@ -1159,6 +1162,12 @@ class basic_decl_plugin : public decl_plugin {
11591162
func_decl * m_iff_oeq_decl;
11601163
func_decl * m_skolemize_decl;
11611164
func_decl * m_mp_oeq_decl;
1165+
func_decl * m_assumption_add_decl;
1166+
func_decl * m_lemma_add_decl;
1167+
func_decl * m_th_assumption_add_decl;
1168+
func_decl * m_th_lemma_add_decl;
1169+
func_decl * m_redundant_del_decl;
1170+
func_decl * m_clause_trail_decl;
11621171
ptr_vector<func_decl> m_apply_def_decls;
11631172
ptr_vector<func_decl> m_nnf_pos_decls;
11641173
ptr_vector<func_decl> m_nnf_neg_decls;
@@ -2298,6 +2307,14 @@ class ast_manager {
22982307
proof * mk_der(quantifier * q, expr * r);
22992308
proof * mk_quant_inst(expr * not_q_or_i, unsigned num_bind, expr* const* binding);
23002309

2310+
proof * mk_clause_trail_elem(proof* p, expr* e, decl_kind k);
2311+
proof * mk_assumption_add(proof* pr, expr* e);
2312+
proof * mk_lemma_add(proof* pr, expr* e);
2313+
proof * mk_th_assumption_add(proof* pr, expr* e);
2314+
proof * mk_th_lemma_add(proof* pr, expr* e);
2315+
proof * mk_redundant_del(expr* e);
2316+
proof * mk_clause_trail(unsigned n, proof* const* ps);
2317+
23012318
proof * mk_def_axiom(expr * ax);
23022319
proof * mk_unit_resolution(unsigned num_proofs, proof * const * proofs);
23032320
proof * mk_unit_resolution(unsigned num_proofs, proof * const * proofs, expr * new_fact);

src/smt/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ z3_add_component(smt
1818
smt_cg_table.cpp
1919
smt_checker.cpp
2020
smt_clause.cpp
21+
smt_clause_proof.cpp
2122
smt_conflict_resolution.cpp
2223
smt_consequences.cpp
2324
smt_context.cpp

src/smt/dyn_ack.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ namespace smt {
374374
justification * js = nullptr;
375375
if (m_manager.proofs_enabled())
376376
js = alloc(dyn_ack_justification, n1, n2);
377-
clause * cls = m_context.mk_clause(lits.size(), lits.c_ptr(), js, CLS_AUX_LEMMA, del_eh);
377+
clause * cls = m_context.mk_clause(lits.size(), lits.c_ptr(), js, CLS_TH_LEMMA, del_eh);
378378
if (!cls) {
379379
dealloc(del_eh);
380380
return;
@@ -426,7 +426,7 @@ namespace smt {
426426
justification * js = nullptr;
427427
if (m_manager.proofs_enabled())
428428
js = alloc(dyn_ack_justification, n1, n2);
429-
clause * cls = m_context.mk_clause(lits.size(), lits.c_ptr(), js, CLS_AUX_LEMMA, del_eh);
429+
clause * cls = m_context.mk_clause(lits.size(), lits.c_ptr(), js, CLS_TH_LEMMA, del_eh);
430430
if (!cls) {
431431
dealloc(del_eh);
432432
return;

src/smt/params/smt_params.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ void smt_params::updt_local_params(params_ref const & _p) {
2727
m_random_seed = p.random_seed();
2828
m_relevancy_lvl = p.relevancy();
2929
m_ematching = p.ematching();
30+
m_clause_proof = p.clause_proof();
3031
m_phase_selection = static_cast<phase_selection>(p.phase_selection());
3132
m_restart_strategy = static_cast<restart_strategy>(p.restart_strategy());
3233
m_restart_factor = p.restart_factor();
@@ -107,6 +108,7 @@ void smt_params::display(std::ostream & out) const {
107108
DISPLAY_PARAM(m_display_features);
108109
DISPLAY_PARAM(m_new_core2th_eq);
109110
DISPLAY_PARAM(m_ematching);
111+
DISPLAY_PARAM(m_clause_proof);
110112

111113
DISPLAY_PARAM(m_case_split_strategy);
112114
DISPLAY_PARAM(m_rel_case_split_order);

src/smt/params/smt_params.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ struct smt_params : public preprocessor_params,
107107
bool m_display_features;
108108
bool m_new_core2th_eq;
109109
bool m_ematching;
110+
bool m_clause_proof;
110111

111112
// -----------------------------------
112113
//
@@ -261,6 +262,7 @@ struct smt_params : public preprocessor_params,
261262
m_display_features(false),
262263
m_new_core2th_eq(true),
263264
m_ematching(true),
265+
m_clause_proof(false),
264266
m_case_split_strategy(CS_ACTIVITY_DELAY_NEW),
265267
m_rel_case_split_order(0),
266268
m_lookahead_diseq(false),

src/smt/params/smt_params_helper.pyg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def_module_params(module_name='smt',
6060
('pb.learn_complements', BOOL, True, 'learn complement literals for Pseudo-Boolean theory'),
6161
('array.weak', BOOL, False, 'weak array theory'),
6262
('array.extensional', BOOL, True, 'extensional array theory'),
63+
('clause_proof', BOOL, False, 'record a clausal proof'),
6364
('dack', UINT, 1, '0 - disable dynamic ackermannization, 1 - expand Leibniz\'s axiom if a congruence is the root of a conflict, 2 - expand Leibniz\'s axiom if a congruence is used during conflict resolution'),
6465
('dack.eq', BOOL, False, 'enable dynamic ackermannization for transtivity of equalities'),
6566
('dack.factor', DOUBLE, 0.1, 'number of instance per conflict'),

0 commit comments

Comments
 (0)