Connect++ 0.7.0
A fast, readable connection prover for first-order logic.
Loading...
Searching...
No Matches
Literal Class Reference

Basic representation of literals, bundling together (pointers to) a Predicate, a collection of arguments each a (pointer to a) Term, an arity and a polarity. More...

#include <Literal.hpp>

Collaboration diagram for Literal:

Public Member Functions

 Literal (Predicate *, const vector< Term * > &, Arity, bool)
 Construct a Literal from existing material.
 
Predicateget_pred () const
 Basic get method.
 
Arity get_arity () const
 Basic get method.
 
bool get_polarity () const
 Basic get method.
 
const vector< Term * > & get_args () const
 Basic get method.
 
Termoperator[] (size_t i) const
 Basic get method.
 
bool is_positive () const
 Basic manipulation - entirely self-explanatory.
 
bool is_negative () const
 Basic manipulation - entirely self-explanatory.
 
void make_positive ()
 Basic manipulation - entirely self-explanatory.
 
void make_negative ()
 Basic manipulation - entirely self-explanatory.
 
void invert ()
 Basic manipulation - entirely self-explanatory.
 
void make_empty ()
 Basic manipulation - entirely self-explanatory.
 
bool is_empty () const
 Basic manipulation - entirely self-explanatory.
 
void clear ()
 Basic manipulation - entirely self-explanatory.
 
size_t get_pred_as_index () const
 Turn a Literal into an array index.
 
bool is_ground () const
 Is the literal ground?
 
bool is_true () const
 Is this equivalent to $true?
 
bool is_false () const
 Is this equivalent to $false?
 
bool contains_variable (Variable *) const
 Does this Literal contain the specified variable?
 
void get_variables (set< Term * > &) const
 Get the variables in this literal without taking account of substitutions.
 
bool is_compatible_with (const Literal *) const
 Literals can only be unified if the polarity and actual predicate are the same.
 
bool is_complement_of (const Literal &) const
 Test whether one literal is exactly the same as another, with the exception of the polarity.
 
string get_small_lit () const
 Get the predicate and polarity as a string.
 
string to_string (bool=false) const
 Full conversion of Literal to string.
 
string to_prolog_string () const
 Convert to a string in a format readable by Prolog.
 
string to_tptp_string (bool=false) const
 Convert to a string in a format compatible with the TPTP.
 
string make_LaTeX (bool=false) const
 Make a useable LaTeX version.
 
string make_Graphviz (bool=false) const
 Make a useable Graphviz version.
 
bool operator== (const Literal &) const
 Equality without taking account of substutions.
 
bool subbed_equal (Literal *) const
 Equality, taking account of substitutions.
 
Literal make_copy_with_new_vars (VariableIndex &, TermIndex &) const
 Make a copy of the Literal but with a new set of variables.
 
Literal make_copy_with_new_vars_helper (VariableIndex &, TermIndex &, unordered_map< Variable *, Term * > &) const
 Helper function for make_copy_with_new_vars.
 
Literal make_copy_with_new_unique_vars_helper (VariableIndex &, TermIndex &, unordered_map< Variable *, Term * > &) const
 Helper function for make_copy_with_unique_new_vars.
 
void make_copy_with_new_vars_replace_helper (VariableIndex &, TermIndex &, unordered_map< Variable *, Term * > &)
 Helper function for making copies with new variables.
 
void replace_variable (Variable *, Variable *, TermIndex *)
 Replace one variable with another throughout.
 
void replace_variable_with_term (Term *, Variable *, TermIndex *)
 Replace one variable with a term throughout.
 

Private Attributes

Predicatepred
 
vector< Term * > args
 
Arity arity
 
bool polarity
 

Friends

ostream & operator<< (ostream &out, const Literal &l)
 

Detailed Description

Basic representation of literals, bundling together (pointers to) a Predicate, a collection of arguments each a (pointer to a) Term, an arity and a polarity.

Definition at line 50 of file Literal.hpp.

Constructor & Destructor Documentation

◆ Literal() [1/2]

Literal::Literal ( )
inline

Definition at line 57 of file Literal.hpp.

57: pred(nullptr), args(), arity(0), polarity(true) {}

◆ Literal() [2/2]

Literal::Literal ( Predicate * new_p,
const vector< Term * > & new_args,
Arity new_ar,
bool new_pol )

Construct a Literal from existing material.

Parameters
new_pPointer to a Predicate
new_argsReference to a vector of pointers to Terms
new_arNew value for arity
new_polSet true for positive literal, false for negative (negated).

Definition at line 28 of file Literal.cpp.

32: pred(new_p)
33, args(new_args)
34, arity(new_ar)
35, polarity(new_pol)
36{
37 #ifdef DEBUGMESSAGES
38 if (new_p == nullptr) {
39 cerr << "Why would you construct an empty predicate?" << endl;
40 }
41 #endif
42 if (new_p->get_arity() != new_args.size()) {
43 cerr << "Number of arguments doesn't match predicate arity" << endl;
44 cerr << "Are you mixing up your predicate names?" << endl;
45 }
46}
Arity get_arity() const
Basic get method.
Definition Predicate.hpp:90

Member Function Documentation

◆ clear()

void Literal::clear ( )
inline

Basic manipulation - entirely self-explanatory.

Definition at line 119 of file Literal.hpp.

119{ pred = nullptr; args.clear(), arity = 0; polarity = true; }

◆ contains_variable()

bool Literal::contains_variable ( Variable * v) const

Does this Literal contain the specified variable?

Parameters
vPointer to Variable to search for.

Definition at line 131 of file Literal.cpp.

131 {
132 for (size_t i = 0; i < args.size(); i++) {
133 // Note that this takes account of substitutions.
134 if (args[i]->contains_variable(v))
135 return true;
136 }
137 return false;
138}
bool contains_variable(Variable *) const
Does this Literal contain the specified variable?
Definition Literal.cpp:131

◆ get_args()

const vector< Term * > & Literal::get_args ( ) const
inline

Basic get method.

Definition at line 83 of file Literal.hpp.

83{ return args; }

◆ get_arity()

Arity Literal::get_arity ( ) const
inline

Basic get method.

Definition at line 75 of file Literal.hpp.

75{ return arity; }

◆ get_polarity()

bool Literal::get_polarity ( ) const
inline

Basic get method.

Definition at line 79 of file Literal.hpp.

79{ return polarity; }

◆ get_pred()

Predicate * Literal::get_pred ( ) const
inline

Basic get method.

Definition at line 71 of file Literal.hpp.

71{ return pred; }

◆ get_pred_as_index()

size_t Literal::get_pred_as_index ( ) const
inline

Turn a Literal into an array index.

This is straightforward: positive literals have even indices and negative literals odd.

Definition at line 126 of file Literal.hpp.

126 {
127 size_t index = pred->get_ID() << 1;
128 if (!polarity)
129 index |= 0x00000001;
130 return index;
131 };
ID get_ID() const
Basic get method.
Definition Predicate.hpp:82

◆ get_small_lit()

string Literal::get_small_lit ( ) const

Get the predicate and polarity as a string.

Definition at line 177 of file Literal.cpp.

177 {
178 string result;
179 if (!polarity)
180 result += unicode_symbols::LogSym::neg;
181 result += pred->to_string();
182 return result;
183}
string to_string() const
Converting to a string just gives you the name.
Definition Predicate.cpp:27

◆ get_variables()

void Literal::get_variables ( set< Term * > & _vs) const

Get the variables in this literal without taking account of substitutions.

Parameters
_vsSet of Term* representing variables.

Definition at line 140 of file Literal.cpp.

140 {
141 for (const Term* arg : args) {
142 set<Term*> vs = arg->all_variables();
143 for (Term* v : vs) {
144 _vs.insert(v);
145 }
146 }
147 }
General representation of terms.
Definition Term.hpp:62

◆ invert()

void Literal::invert ( )
inline

Basic manipulation - entirely self-explanatory.

Definition at line 107 of file Literal.hpp.

107{ polarity = !polarity; }

◆ is_compatible_with()

bool Literal::is_compatible_with ( const Literal * l) const

Literals can only be unified if the polarity and actual predicate are the same.

One does not generally expect literals to be differentiated by arity, but it's possible so we check that too.

Parameters
lPointer to Literal to compare with.

Definition at line 84 of file Literal.cpp.

84 {
85 #ifdef DEBUGMESSAGES
86 if (pred == nullptr || l->pred == nullptr) {
87 cerr << "You shouldn't be checking compatibility of empty Literals" << endl;
88 }
89 #endif
90 return (pred == l->pred &&
91 polarity == l->polarity &&
92 arity == l->arity);
93}

◆ is_complement_of()

bool Literal::is_complement_of ( const Literal & l) const

Test whether one literal is exactly the same as another, with the exception of the polarity.

This also requires that the argument lists are the same.

Parameters
lLiteral to compare with.

Definition at line 95 of file Literal.cpp.

95 {
96 return (pred == l.pred &&
97 args == l.args &&
98 arity == l.arity &&
99 !polarity == l.polarity);
100}

◆ is_empty()

bool Literal::is_empty ( ) const
inline

Basic manipulation - entirely self-explanatory.

Definition at line 115 of file Literal.hpp.

115{ return (pred == nullptr); }

◆ is_false()

bool Literal::is_false ( ) const

Is this equivalent to $false?

Definition at line 121 of file Literal.cpp.

121 {
122 return ((polarity &&
123 (pred->get_name() == string("$false")) &&
124 (pred->get_arity() == 0))
125 ||
126 (!polarity &&
127 (pred->get_name() == string("$true")) &&
128 (pred->get_arity() == 0)));
129}
string get_name() const
Basic get method.
Definition Predicate.hpp:86

◆ is_ground()

bool Literal::is_ground ( ) const

Is the literal ground?

Do not attempt to follow substitutions.

Definition at line 102 of file Literal.cpp.

102 {
103 for (Term* t : args) {
104 if (!t->is_ground()) {
105 return false;
106 }
107 }
108 return true;
109}

◆ is_negative()

bool Literal::is_negative ( ) const
inline

Basic manipulation - entirely self-explanatory.

Definition at line 95 of file Literal.hpp.

95{ return !polarity; }

◆ is_positive()

bool Literal::is_positive ( ) const
inline

Basic manipulation - entirely self-explanatory.

Definition at line 91 of file Literal.hpp.

91{ return polarity; }

◆ is_true()

bool Literal::is_true ( ) const

Is this equivalent to $true?

Definition at line 111 of file Literal.cpp.

111 {
112 return ((polarity &&
113 (pred->get_name() == string("$true")) &&
114 (pred->get_arity() == 0))
115 ||
116 (!polarity &&
117 (pred->get_name() == string("$false")) &&
118 (pred->get_arity() == 0)));
119}

◆ make_copy_with_new_unique_vars_helper()

Literal Literal::make_copy_with_new_unique_vars_helper ( VariableIndex & vi,
TermIndex & ti,
unordered_map< Variable *, Term * > & new_vars ) const

Helper function for make_copy_with_unique_new_vars.

Iterates over the args using the corresponding method in the Term class to do the real work.

This version uses unique variables, not recycled when backtracking, and thus suitable for caching clauses.

Parameters
viReference to the VariableIndex
tiReference to the TermIndex
new_varsReference to an unordered_map from pointers to Variables, to pointers to Terms. Initially empty. On completion contains a map from variables, to the terms corresponding to the new variables made to replace them.

Definition at line 58 of file Literal.cpp.

60 {
61 vector<Term*> new_args;
62 for (size_t i = 0; i < arity; i++)
63 new_args.push_back(args[i]->make_copy_with_new_unique_vars_helper(vi, ti, new_vars));
64 Literal result(pred, new_args, arity, polarity);
65 return result;
66}
Basic representation of literals, bundling together (pointers to) a Predicate, a collection of argume...
Definition Literal.hpp:50

◆ make_copy_with_new_vars()

Literal Literal::make_copy_with_new_vars ( VariableIndex & vi,
TermIndex & ti ) const

Make a copy of the Literal but with a new set of variables.

All the heavy lifting is done by the Term class. Essentially just initializes an unordered_map and calls the corresponging helper.

Parameters
viReference to the VariableIndex
tiReference to the TermIndex

Definition at line 75 of file Literal.cpp.

75 {
76 #ifdef DEBUGMESSAGES
77 if (pred == nullptr)
78 cerr << "You shouldn't be making copies of empty Literals" << endl;
79 #endif
80 unordered_map<Variable*,Term*> new_vars;
81 return make_copy_with_new_vars_helper(vi, ti, new_vars);
82}
Literal make_copy_with_new_vars_helper(VariableIndex &, TermIndex &, unordered_map< Variable *, Term * > &) const
Helper function for make_copy_with_new_vars.
Definition Literal.cpp:48

◆ make_copy_with_new_vars_helper()

Literal Literal::make_copy_with_new_vars_helper ( VariableIndex & vi,
TermIndex & ti,
unordered_map< Variable *, Term * > & new_vars ) const

Helper function for make_copy_with_new_vars.

Iterates over the args using the corresponding method in the Term class to do the real work.

Parameters
viReference to the VariableIndex
tiReference to the TermIndex
new_varsReference to an unordered_map from pointers to Variables, to pointers to Terms. Initially empty. On completion contains a map from variables, to the terms corresponding to the new variables made to replace them.

Definition at line 48 of file Literal.cpp.

50 {
51 vector<Term*> new_args;
52 for (size_t i = 0; i < arity; i++)
53 new_args.push_back(args[i]->make_copy_with_new_vars_helper(vi, ti, new_vars));
54 Literal result(pred, new_args, arity, polarity);
55 return result;
56}

◆ make_copy_with_new_vars_replace_helper()

void Literal::make_copy_with_new_vars_replace_helper ( VariableIndex & vi,
TermIndex & ti,
unordered_map< Variable *, Term * > & new_vars )

Helper function for making copies with new variables.

Iterates over the args using the corresponding method in the Term class to do the real work.

Parameters
viReference to the VariableIndex
tiReference to the TermIndex
new_varsReference to an unordered_map from pointers to Variables, to pointers to Terms. Initially empty. On completion contains a map from variables, to the terms corresponding to the new variables made to replace them.

Definition at line 68 of file Literal.cpp.

70 {
71 for (size_t i = 0; i < arity; i++)
72 args[i] = args[i]->make_copy_with_new_vars_helper(vi, ti, new_vars);
73}

◆ make_empty()

void Literal::make_empty ( )
inline

Basic manipulation - entirely self-explanatory.

Definition at line 111 of file Literal.hpp.

111{ pred = nullptr; }

◆ make_Graphviz()

string Literal::make_Graphviz ( bool subbed = false) const

Make a useable Graphviz version.

Parameters
subbedImplement substitutions if true.

Definition at line 270 of file Literal.cpp.

270 {
271 string s;
272 if (!polarity)
273 s += unicode_symbols::LogSym::neg;
274 s += pred->make_Graphviz();
275 if (arity > 0) {
276 s += "(";
277 commas::comma com(arity);
278 for (Term* p : args) {
279 s += p->make_Graphviz(subbed);
280 s += com();
281 }
282 s += ")";
283 }
284 return s;
285}
string make_Graphviz() const
Make a useable Graphviz version.
Definition Predicate.cpp:43
Simple function object for putting commas in lists.

◆ make_LaTeX()

string Literal::make_LaTeX ( bool subbed = false) const

Make a useable LaTeX version.

Assumes you are typesetting in Math Mode.

Parameters
subbedImplement substitutions if true.

Definition at line 253 of file Literal.cpp.

253 {
254 string s;
255 if (!polarity)
256 s += "\\neg ";
257 s += pred->make_LaTeX();
258 if (arity > 0) {
259 s += "(";
260 commas::comma com(arity);
261 for (Term* p : args) {
262 s += p->make_LaTeX(subbed);
263 s += com();
264 }
265 s += ")";
266 }
267 return s;
268}
string make_LaTeX() const
Make a useable LaTeX version.
Definition Predicate.cpp:36

◆ make_negative()

void Literal::make_negative ( )
inline

Basic manipulation - entirely self-explanatory.

Definition at line 103 of file Literal.hpp.

103{ polarity = false; }

◆ make_positive()

void Literal::make_positive ( )
inline

Basic manipulation - entirely self-explanatory.

Definition at line 99 of file Literal.hpp.

99{ polarity = true; }

◆ operator==()

bool Literal::operator== ( const Literal & l) const

Equality without taking account of substutions.

Parameters
lLiteral to compare with.

Definition at line 149 of file Literal.cpp.

149 {
150 #ifdef DEBUGMESSAGES
151 if (pred == nullptr || l.pred == nullptr) {
152 cerr << "You shouldn't be checking equality of empty Literals" << endl;
153 }
154 #endif
155 return (pred == l.pred &&
156 args == l.args &&
157 arity == l.arity &&
158 polarity == l.polarity);
159}

◆ operator[]()

Term * Literal::operator[] ( size_t i) const
inline

Basic get method.

Definition at line 87 of file Literal.hpp.

87{ return args[i]; }

◆ replace_variable()

void Literal::replace_variable ( Variable * new_var,
Variable * old_var,
TermIndex * ti )

Replace one variable with another throughout.

Iterate over the args using the replace_variable_in_term method in TermIndex to do the real work.

Parameters
new_varPointer to new Variable
old_varPointer to old Variable
tiPointer to the TermIndex

Definition at line 287 of file Literal.cpp.

288 {
289#ifdef DEBUGMESSAGES
290 if (pred == nullptr)
291 cerr << "You shouldn't be replacing variables in an empty Literal" << endl;
292#endif
293 for (size_t i = 0; i < arity; i++) {
294 args[i] = ti->replace_variable_in_term(new_var, old_var, args[i]);
295 }
296}
Term * replace_variable_in_term(Variable *, Variable *, Term *)
Replace a variable in a term with an alternative, maintaining the structure of the TermIndex.
Definition TermIndex.cpp:74

◆ replace_variable_with_term()

void Literal::replace_variable_with_term ( Term * new_term,
Variable * old_var,
TermIndex * ti )

Replace one variable with a term throughout.

Iterate over the args using the replace_variable_in_term_with_term method in TermIndex to do the real work.

Parameters
new_termPointer to new Term
old_varPointer to old Variable
tiPointer to the TermIndex

Definition at line 298 of file Literal.cpp.

299 {
300#ifdef DEBUGMESSAGES
301 if (pred == nullptr)
302 cerr << "You shouldn't be subbing terms in an empty Literal" << endl;
303#endif
304 for (size_t i = 0; i < arity; i++) {
305 args[i] = ti->replace_variable_in_term_with_term(new_term, old_var, args[i]);
306 }
307}
Term * replace_variable_in_term_with_term(Term *, Variable *, Term *)
Minor variation on replace_variable_in_term.
Definition TermIndex.cpp:95

◆ subbed_equal()

bool Literal::subbed_equal ( Literal * l) const

Equality, taking account of substitutions.

Parameters
lPointer to Literal to compare with

Definition at line 161 of file Literal.cpp.

161 {
162 #ifdef DEBUGMESSAGES
163 if (pred == nullptr || l->pred == nullptr) {
164 cerr << "You shouldn't be checking subbed equality of empty Literals" << endl;
165 }
166 #endif
167 if (!is_compatible_with(l)) {
168 return false;
169 }
170 for (size_t i = 0; i < arity; i++) {
171 if (!(args[i]->subbed_equal((l->args)[i])))
172 return false;
173 }
174 return true;
175}
bool is_compatible_with(const Literal *) const
Literals can only be unified if the polarity and actual predicate are the same.
Definition Literal.cpp:84
bool subbed_equal(Literal *) const
Equality, taking account of substitutions.
Definition Literal.cpp:161

◆ to_prolog_string()

string Literal::to_prolog_string ( ) const

Convert to a string in a format readable by Prolog.

Does not apply substitutions.

Definition at line 205 of file Literal.cpp.

205 {
206 string result;
207 if (!polarity)
208 result += "-";
209 string name = pred->get_name();
210 if (name == "=")
211 name = "equal";
212 result += name;
213 if (arity > 0) {
214 result += "(";
215 commas::comma com(args.size());
216 for (Term* p : args) {
217 result += p->to_prolog_string();
218 result += com();
219 }
220 result += ")";
221 }
222 return result;
223}

◆ to_string()

string Literal::to_string ( bool subbed = false) const

Full conversion of Literal to string.

Parameters
subbedImplement substitutions if true.

Definition at line 185 of file Literal.cpp.

185 {
186 string result("Empty literal");
187 if (!is_empty()) {
188 if (pred->get_name() == string("=")) {
189 result = "( ";
190 result += args[0]->to_string(subbed);
191 result += " ";
192 result += polarity ? "=" : unicode_symbols::LogSym::neq;
193 result += " ";
194 result += args[1]->to_string(subbed);
195 result += " )";
196 }
197 else {
198 result = get_small_lit();
199 result += vector_to_string(args, subbed);
200 }
201 }
202 return result;
203}
bool is_empty() const
Basic manipulation - entirely self-explanatory.
Definition Literal.hpp:115
string get_small_lit() const
Get the predicate and polarity as a string.
Definition Literal.cpp:177

◆ to_tptp_string()

string Literal::to_tptp_string ( bool subbed = false) const

Convert to a string in a format compatible with the TPTP.

Apply substitutions if argument is true.

Definition at line 225 of file Literal.cpp.

225 {
226 string result;
227 string name = pred->get_name();
228 if (name != "=") {
229 if (!polarity)
230 result += "~";
231 result += name;
232 if (arity > 0) {
233 result += "(";
234 commas::comma com(args.size());
235 for (Term* p : args) {
236 result += p->to_prolog_string(subbed);
237 result += com();
238 }
239 result += ")";
240 }
241 }
242 else {
243 result += args[0]->to_prolog_string(subbed);
244 if (polarity)
245 result += " = ";
246 else
247 result += " != ";
248 result += args[1]->to_prolog_string(subbed);
249 }
250 return result;
251}

Friends And Related Symbol Documentation

◆ operator<<

ostream & operator<< ( ostream & out,
const Literal & l )
friend

Definition at line 309 of file Literal.cpp.

309 {
310 if (l.is_empty())
311 out << "Empty literal";
312 else {
313 if (!l.polarity)
314 out << unicode_symbols::LogSym::neg;
315 out << l.pred->to_string();
316 out << vector_to_string(l.args);
317 }
318 return out;
319}

Member Data Documentation

◆ args

vector<Term*> Literal::args
private

Definition at line 53 of file Literal.hpp.

◆ arity

Arity Literal::arity
private

Definition at line 54 of file Literal.hpp.

◆ polarity

bool Literal::polarity
private

Definition at line 55 of file Literal.hpp.

◆ pred

Predicate* Literal::pred
private

Definition at line 52 of file Literal.hpp.


The documentation for this class was generated from the following files: