CBMC
satcheck_zchaff.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
9 #include "satcheck_zchaff.h"
10 
11 #include <util/invariant.h>
12 
13 #include <zchaff_solver.h>
14 
16 {
17  status=INIT;
18  solver->set_randomness(0);
19  solver->set_variable_number(0);
20 }
21 
23 {
24 }
25 
27 {
29 
30  if(a.is_true())
31  return tvt(true);
32  else if(a.is_false())
33  return tvt(false);
34 
35  tvt result;
36 
37  INVARIANT(
38  a.var_no() < solver->variables().size(),
39  "variable number shall be within bounds");
40 
41  switch(solver->variable(a.var_no()).value())
42  {
43  case 0: result=tvt(false); break;
44  case 1: result=tvt(true); break;
45  default: result=tvt(tvt::tv_enumt::TV_UNKNOWN); break;
46  }
47 
48  if(a.sign())
49  result=!result;
50 
51  return result;
52 }
53 
55 {
56  return solver->version();
57 }
58 
60 {
62 
63  // this can only be called once
64  solver->set_variable_number(no_variables());
65 
66  for(clausest::const_iterator it=clauses.begin();
67  it!=clauses.end();
68  it++)
69  solver->add_orig_clause(
70  reinterpret_cast<int*>(&((*it)[0])), it->size());
71 }
72 
74 {
75  // this is *not* incremental
77 
78  copy_cnf();
79 
80  {
81  std::string msg=
82  std::to_string(solver->num_variables())+" variables, "+
83  std::to_string(solver->clauses().size())+" clauses";
84  log.statistics() << msg << messaget::eom;
85  }
86 
87  SAT_StatusT result=(SAT_StatusT)solver->solve();
88 
89  {
90  std::string msg;
91 
92  switch(result)
93  {
94  case UNSATISFIABLE:
95  msg="SAT checker: instance is UNSATISFIABLE";
96  break;
97 
98  case SATISFIABLE:
99  msg="SAT checker: instance is SATISFIABLE";
100  break;
101 
102  case UNDETERMINED:
103  msg="SAT checker failed: UNDETERMINED";
104  break;
105 
106  case TIME_OUT:
107  msg="SAT checker failed: Time out";
108  break;
109 
110  case MEM_OUT:
111  msg="SAT checker failed: Out of memory";
112  break;
113 
114  case ABORTED:
115  msg="SAT checker failed: ABORTED";
116  break;
117 
118  default:
119  msg="SAT checker failed: unknown result";
120  break;
121  }
122 
123  log.status() << msg << messaget::eom;
124  }
125 
126  if(result==SATISFIABLE)
127  {
128  // see if it is complete
129  for(unsigned i=1; i<solver->variables().size(); i++)
130  INVARIANT(
131  solver->variables()[i].value() == 0 ||
132  solver->variables()[i].value() == 1,
133  "all variables shall have been assigned");
134  }
135 
136  #ifdef DEBUG
137  if(result==SATISFIABLE)
138  {
139  for(unsigned i=2; i<(_no_variables*2); i+=2)
140  cout << "DEBUG L" << i << ":" << get(i) << '\n';
141  }
142  #endif
143 
144  if(result==UNSATISFIABLE)
145  {
146  status=UNSAT;
147  return P_UNSATISFIABLE;
148  }
149 
150  if(result==SATISFIABLE)
151  {
152  status=SAT;
153  return P_SATISFIABLE;
154  }
155 
156  status=ERROR;
157 
158  return P_ERROR;
159 }
160 
162 {
163  unsigned v=a.var_no();
164  bool sign=a.sign();
165  value^=sign;
166  solver->variables()[v].set_value(value);
167 }
168 
170  satcheck_zchaff_baset(new CSolver)
171 {
172 }
173 
175 {
176  delete solver;
177 }
satcheck_zchafft::satcheck_zchafft
satcheck_zchafft()
Definition: satcheck_zchaff.cpp:169
satcheck_zchaff_baset::copy_cnf
virtual void copy_cnf()
Definition: satcheck_zchaff.cpp:59
cnf_clause_listt::clauses
clausest clauses
Definition: cnf_clause_list.h:85
satcheck_zchaff_baset::INIT
@ INIT
Definition: satcheck_zchaff.h:42
messaget::status
mstreamt & status() const
Definition: message.h:414
satcheck_zchaff_baset::UNSAT
@ UNSAT
Definition: satcheck_zchaff.h:42
satcheck_zchaff_baset::satcheck_zchaff_baset
satcheck_zchaff_baset(CSolver *_solver)
Definition: satcheck_zchaff.cpp:15
invariant.h
satcheck_zchaff_baset::l_get
tvt l_get(literalt a) const override
Definition: satcheck_zchaff.cpp:26
satcheck_zchaff_baset::~satcheck_zchaff_baset
virtual ~satcheck_zchaff_baset()
Definition: satcheck_zchaff.cpp:22
to_string
std::string to_string(const string_not_contains_constraintt &expr)
Used for debug printing.
Definition: string_constraint.cpp:58
messaget::eom
static eomt eom
Definition: message.h:297
literalt::var_no
var_not var_no() const
Definition: literal.h:83
satcheck_zchaff.h
literalt::is_true
bool is_true() const
Definition: literal.h:156
satcheck_zchaff_baset::set_assignment
void set_assignment(literalt a, bool value) override
Definition: satcheck_zchaff.cpp:161
PRECONDITION
#define PRECONDITION(CONDITION)
Definition: invariant.h:463
satcheck_zchaff_baset::solver_text
const std::string solver_text() override
Definition: satcheck_zchaff.cpp:54
literalt::is_false
bool is_false() const
Definition: literal.h:161
propt::resultt
resultt
Definition: prop.h:97
satcheck_zchafft::~satcheck_zchafft
virtual ~satcheck_zchafft()
Definition: satcheck_zchaff.cpp:174
satcheck_zchaff_baset::status
statust status
Definition: satcheck_zchaff.h:43
tvt
Definition: threeval.h:19
literalt::sign
bool sign() const
Definition: literal.h:88
satcheck_zchaff_baset
Definition: satcheck_zchaff.h:21
solver
int solver(std::istream &in)
Definition: smt2_solver.cpp:407
literalt
Definition: literal.h:25
cnft::_no_variables
size_t _no_variables
Definition: cnf.h:57
tvt::tv_enumt::TV_UNKNOWN
@ TV_UNKNOWN
propt::log
messaget log
Definition: prop.h:128
satcheck_zchaff_baset::ERROR
@ ERROR
Definition: satcheck_zchaff.h:42
cnft::no_variables
virtual size_t no_variables() const override
Definition: cnf.h:42
satcheck_zchaff_baset::do_prop_solve
resultt do_prop_solve() override
Definition: satcheck_zchaff.cpp:73
validation_modet::INVARIANT
@ INVARIANT
messaget::statistics
mstreamt & statistics() const
Definition: message.h:419
satcheck_zchaff_baset::SAT
@ SAT
Definition: satcheck_zchaff.h:42
satcheck_zchaff_baset::solver
CSolver * solver
Definition: satcheck_zchaff.h:40