mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 09:05:31 +00:00
adding dump facility for cancelation #2095, easing dimacs in/out
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
f7746e2284
commit
498864c582
28 changed files with 653 additions and 518 deletions
|
@ -17,6 +17,7 @@ z3_add_component(ast
|
|||
csp_decl_plugin.cpp
|
||||
datatype_decl_plugin.cpp
|
||||
decl_collector.cpp
|
||||
display_dimacs.cpp
|
||||
dl_decl_plugin.cpp
|
||||
expr2polynomial.cpp
|
||||
expr2var.cpp
|
||||
|
|
81
src/ast/display_dimacs.cpp
Normal file
81
src/ast/display_dimacs.cpp
Normal file
|
@ -0,0 +1,81 @@
|
|||
/*++
|
||||
Copyright (c) 2019 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
display_dimacs.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Display expressions in DIMACS format.
|
||||
|
||||
Author:
|
||||
|
||||
Nikolaj Bjorner (nbjorner0 2019-01-24
|
||||
|
||||
Revision History:
|
||||
|
||||
--*/
|
||||
|
||||
#include "ast.h"
|
||||
#include "display_dimacs.h"
|
||||
|
||||
std::ostream& display_dimacs(std::ostream& out, expr_ref_vector const& fmls) {
|
||||
ast_manager& m = fmls.m();
|
||||
unsigned_vector expr2var;
|
||||
ptr_vector<expr> exprs;
|
||||
unsigned num_vars = 0;
|
||||
unsigned num_cls = fmls.size();
|
||||
for (expr * f : fmls) {
|
||||
unsigned num_lits;
|
||||
expr * const * lits;
|
||||
if (m.is_or(f)) {
|
||||
num_lits = to_app(f)->get_num_args();
|
||||
lits = to_app(f)->get_args();
|
||||
}
|
||||
else {
|
||||
num_lits = 1;
|
||||
lits = &f;
|
||||
}
|
||||
for (unsigned j = 0; j < num_lits; j++) {
|
||||
expr * l = lits[j];
|
||||
if (m.is_not(l))
|
||||
l = to_app(l)->get_arg(0);
|
||||
if (expr2var.get(l->get_id(), UINT_MAX) == UINT_MAX) {
|
||||
num_vars++;
|
||||
expr2var.setx(l->get_id(), num_vars, UINT_MAX);
|
||||
exprs.setx(l->get_id(), l, nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
out << "p cnf " << num_vars << " " << num_cls << "\n";
|
||||
for (expr* f : fmls) {
|
||||
unsigned num_lits;
|
||||
expr * const * lits;
|
||||
if (m.is_or(f)) {
|
||||
num_lits = to_app(f)->get_num_args();
|
||||
lits = to_app(f)->get_args();
|
||||
}
|
||||
else {
|
||||
num_lits = 1;
|
||||
lits = &f;
|
||||
}
|
||||
for (unsigned j = 0; j < num_lits; j++) {
|
||||
expr * l = lits[j];
|
||||
if (m.is_not(l)) {
|
||||
out << "-";
|
||||
l = to_app(l)->get_arg(0);
|
||||
}
|
||||
SASSERT(exprs[l->get_id()]);
|
||||
out << expr2var[l->get_id()] << " ";
|
||||
}
|
||||
out << "0\n";
|
||||
}
|
||||
for (expr* e : exprs) {
|
||||
if (e && is_app(e)) {
|
||||
symbol const& n = to_app(e)->get_decl()->get_name();
|
||||
out << "c " << expr2var[e->get_id()] << " " << n << "\n";
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
26
src/ast/display_dimacs.h
Normal file
26
src/ast/display_dimacs.h
Normal file
|
@ -0,0 +1,26 @@
|
|||
/*++
|
||||
Copyright (c) 2019 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
display_dimacs.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Display expressions in DIMACS format.
|
||||
|
||||
Author:
|
||||
|
||||
Nikolaj Bjorner (nbjorner0 2019-01-24
|
||||
|
||||
Revision History:
|
||||
|
||||
--*/
|
||||
#ifndef DISPLAY_DIMACS_H_
|
||||
#define DISPLAY_DIMACS_H_
|
||||
|
||||
#include "ast.h"
|
||||
|
||||
std::ostream& display_dimacs(std::ostream& out, expr_ref_vector const& fmls);
|
||||
|
||||
#endif /* DISPLAY_DIMACS_H__ */
|
Loading…
Add table
Add a link
Reference in a new issue