CBMC
cnf_clause_list.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: CNF Generation
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
11 
12 #ifndef CPROVER_SOLVERS_SAT_CNF_CLAUSE_LIST_H
13 #define CPROVER_SOLVERS_SAT_CNF_CLAUSE_LIST_H
14 
15 #include <list>
16 
17 #include <util/threeval.h>
18 
19 #include "cnf.h"
20 
21 // CNF given as a list of clauses
22 
23 class cnf_clause_listt:public cnft
24 {
25 public:
26  explicit cnf_clause_listt(message_handlert &message_handler)
27  : cnft(message_handler)
28  {
29  }
30  virtual ~cnf_clause_listt() { }
31 
32  void lcnf(const bvt &bv) override;
33 
34  const std::string solver_text() override
35  { return "CNF clause list"; }
36 
37  tvt l_get(literalt) const override
38  {
39  return tvt::unknown();
40  }
41 
42  size_t no_clauses() const override
43  {
44  return clauses.size();
45  }
46 
47  typedef std::list<bvt> clausest;
48 
49  clausest &get_clauses() { return clauses; }
50 
51  void copy_to(cnft &cnf) const
52  {
54  for(clausest::const_iterator
55  it=clauses.begin();
56  it!=clauses.end();
57  it++)
58  cnf.lcnf(*it);
59  }
60 
61  static size_t hash_clause(const bvt &bv)
62  {
63  size_t result=0;
64  for(bvt::const_iterator it=bv.begin(); it!=bv.end(); it++)
65  result=((result<<2)^it->get())-result;
66 
67  return result;
68  }
69 
70  size_t hash() const
71  {
72  size_t result=0;
73  for(clausest::const_iterator it=clauses.begin(); it!=clauses.end(); it++)
74  result=((result<<2)^hash_clause(*it))-result;
75 
76  return result;
77  }
78 
79 protected:
81  {
82  return resultt::P_ERROR;
83  }
84 
86 };
87 
88 // CNF given as a list of clauses
89 // PLUS an assignment to the variables
90 
92 {
93 public:
94  explicit cnf_clause_list_assignmentt(message_handlert &message_handler)
95  : cnf_clause_listt(message_handler)
96  {
97  }
98 
99  typedef std::vector<tvt> assignmentt;
100 
102  {
103  return assignment;
104  }
105 
106  tvt l_get(literalt literal) const override
107  {
108  if(literal.is_true())
109  return tvt(true);
110  if(literal.is_false())
111  return tvt(false);
112 
113  unsigned v=literal.var_no();
114 
115  if(v==0 || v>=assignment.size())
116  return tvt::unknown();
117 
118  tvt r=assignment[v];
119  return literal.sign()?!r:r;
120  }
121 
122  virtual void copy_assignment_from(const propt &prop);
123  void print_assignment(std::ostream &out) const;
124 
125 protected:
127 };
128 
129 #endif // CPROVER_SOLVERS_SAT_CNF_CLAUSE_LIST_H
cnf_clause_listt::~cnf_clause_listt
virtual ~cnf_clause_listt()
Definition: cnf_clause_list.h:30
cnf_clause_listt::cnf_clause_listt
cnf_clause_listt(message_handlert &message_handler)
Definition: cnf_clause_list.h:26
cnf_clause_listt::clauses
clausest clauses
Definition: cnf_clause_list.h:85
cnf_clause_list_assignmentt::copy_assignment_from
virtual void copy_assignment_from(const propt &prop)
Definition: cnf_clause_list.cpp:32
bvt
std::vector< literalt > bvt
Definition: literal.h:201
cnf_clause_listt
Definition: cnf_clause_list.h:23
threeval.h
cnf_clause_listt::lcnf
void lcnf(const bvt &bv) override
Definition: cnf_clause_list.cpp:16
cnf_clause_list_assignmentt
Definition: cnf_clause_list.h:91
cnft
Definition: cnf.h:17
literalt::var_no
var_not var_no() const
Definition: literal.h:83
cnf_clause_list_assignmentt::l_get
tvt l_get(literalt literal) const override
Definition: cnf_clause_list.h:106
cnf_clause_listt::no_clauses
size_t no_clauses() const override
Definition: cnf_clause_list.h:42
literalt::is_true
bool is_true() const
Definition: literal.h:156
cnft::set_no_variables
virtual void set_no_variables(size_t no)
Definition: cnf.h:43
cnf_clause_listt::clausest
std::list< bvt > clausest
Definition: cnf_clause_list.h:47
propt::resultt::P_ERROR
@ P_ERROR
literalt::is_false
bool is_false() const
Definition: literal.h:161
message_handlert
Definition: message.h:27
tvt::unknown
static tvt unknown()
Definition: threeval.h:33
propt::resultt
resultt
Definition: prop.h:97
cnf_clause_listt::solver_text
const std::string solver_text() override
Definition: cnf_clause_list.h:34
cnf_clause_list_assignmentt::print_assignment
void print_assignment(std::ostream &out) const
Definition: cnf_clause_list.cpp:26
cnf_clause_listt::hash_clause
static size_t hash_clause(const bvt &bv)
Definition: cnf_clause_list.h:61
cnf_clause_listt::l_get
tvt l_get(literalt) const override
Definition: cnf_clause_list.h:37
cnf_clause_listt::get_clauses
clausest & get_clauses()
Definition: cnf_clause_list.h:49
tvt
Definition: threeval.h:19
literalt::sign
bool sign() const
Definition: literal.h:88
cnf_clause_list_assignmentt::get_assignment
assignmentt & get_assignment()
Definition: cnf_clause_list.h:101
propt
TO_BE_DOCUMENTED.
Definition: prop.h:22
cnf_clause_list_assignmentt::assignmentt
std::vector< tvt > assignmentt
Definition: cnf_clause_list.h:99
literalt
Definition: literal.h:25
cnft::_no_variables
size_t _no_variables
Definition: cnf.h:57
r
static int8_t r
Definition: irep_hash.h:60
cnf_clause_listt::copy_to
void copy_to(cnft &cnf) const
Definition: cnf_clause_list.h:51
cnf_clause_list_assignmentt::cnf_clause_list_assignmentt
cnf_clause_list_assignmentt(message_handlert &message_handler)
Definition: cnf_clause_list.h:94
cnf.h
cnf_clause_list_assignmentt::assignment
assignmentt assignment
Definition: cnf_clause_list.h:126
cnf_clause_listt::hash
size_t hash() const
Definition: cnf_clause_list.h:70
propt::lcnf
void lcnf(literalt l0, literalt l1)
Definition: prop.h:56
cnf_clause_listt::do_prop_solve
resultt do_prop_solve() override
Definition: cnf_clause_list.h:80