3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-07 18:05:21 +00:00
z3/shell/simple_sat.cpp
Leonardo de Moura 68269c43a6 other components
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2012-10-02 11:48:48 -07:00

119 lines
2.5 KiB
C++

/*++
Copyright (c) 2006 Microsoft Corporation
Module Name:
simple_sat.cpp
Abstract:
<abstract>
Author:
Leonardo de Moura (leonardo) 2006-10-10.
Revision History:
--*/
#include<fstream>
#include<time.h>
#include"front_end_params.h"
#include"sat_def.h"
#include"dimacs_parser.h"
#include"timeit.h"
#include"mem_stat.h"
class simple_sat_solver : public no_extension {
const front_end_params & m_params;
sat_solver<simple_sat_solver> * m_sat;
unsigned m_num_vars;
svector<lbool> m_model;
public:
simple_sat_solver(const front_end_params & p):
m_params(p),
m_sat(new sat_solver<simple_sat_solver>(*this, p)),
m_num_vars(0) {
}
~simple_sat_solver() {
delete m_sat;
}
static bool enable_ref_counters() {
return false;
}
void mk_var() {
m_sat->mk_var();
m_num_vars++;
}
void mk_clause(const literal_vector & lits) {
m_sat->mk_main_clause(lits);
}
unsigned get_num_vars() const {
return m_num_vars;
}
lbool check() {
return m_sat->check();
}
void mk_model() {
if (m_params.m_build_model) {
m_sat->save_assignment(m_model);
}
}
void display_model(std::ostream & out) const {
int sz = m_model.size();
for (int i = 1; i < sz; i++) {
if (m_model[i] == l_true) {
out << i << " ";
}
else if (m_model[i] == l_false) {
out << -i << " ";
}
}
out << "\n";
}
void display_statistics(std::ostream & out) const {
m_sat->display_statistics(out);
}
};
extern bool g_display_statistics;
extern front_end_params g_front_end_params;
void solve_cnf(const char * file) {
clock_t start_time = clock();
simple_sat_solver solver(g_front_end_params);
std::ifstream in(file);
parse_dimacs(in, solver);
lbool r = solver.check();
clock_t end_time = clock();
switch(r) {
case l_false:
std::cout << "unsat\n";
break;
case l_undef:
std::cout << "unknown\n";
break;
case l_true:
std::cout << "sat\n";
if (g_front_end_params.m_build_model) {
solver.display_model(std::cout);
}
break;
}
if (g_display_statistics) {
solver.display_statistics(std::cerr);
memory::display_max_usage(std::cerr);
std::cerr << "time: " << ((static_cast<double>(end_time) - static_cast<double>(start_time)) / CLOCKS_PER_SEC) << "\n";
}
}