Connect++ 0.6.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?
 
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 () const
 Convert to a string in a format compatible with the TPTP.
 
string make_LaTeX (bool=false) const
 Make a useable LaTeX 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.
 
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 &, const Literal &)
 

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 121 of file Literal.cpp.

121 {
122 for (size_t i = 0; i < args.size(); i++) {
123 // Note that this takes account of substitutions.
124 if (args[i]->contains_variable(v))
125 return true;
126 }
127 return false;
128}
bool contains_variable(Variable *) const
Does this Literal contain the specified variable?
Definition Literal.cpp:121

◆ 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 158 of file Literal.cpp.

158 {
159 string result;
160 if (!polarity)
161 result += unicode_symbols::LogSym::neg;
162 result += pred->to_string();
163 return result;
164}
string to_string() const
Converting to a string just gives you the name.
Definition Predicate.cpp:27

◆ 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 74 of file Literal.cpp.

74 {
75 #ifdef DEBUGMESSAGES
76 if (pred == nullptr || l->pred == nullptr) {
77 cerr << "You shouldn't be checking compatibility of empty Literals" << endl;
78 }
79 #endif
80 return (pred == l->pred &&
81 polarity == l->polarity &&
82 arity == l->arity);
83}

◆ 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 85 of file Literal.cpp.

85 {
86 return (pred == l.pred &&
87 args == l.args &&
88 arity == l.arity &&
89 !polarity == l.polarity);
90}

◆ 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 111 of file Literal.cpp.

111 {
112 return ((polarity &&
113 (pred->get_name() == string("$false")) &&
114 (pred->get_arity() == 0))
115 ||
116 (!polarity &&
117 (pred->get_name() == string("$true")) &&
118 (pred->get_arity() == 0)));
119}
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 92 of file Literal.cpp.

92 {
93 for (Term* t : args) {
94 if (!t->is_ground()) {
95 return false;
96 }
97 }
98 return true;
99}
General representation of terms.
Definition Term.hpp:62

◆ 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 101 of file Literal.cpp.

101 {
102 return ((polarity &&
103 (pred->get_name() == string("$true")) &&
104 (pred->get_arity() == 0))
105 ||
106 (!polarity &&
107 (pred->get_name() == string("$false")) &&
108 (pred->get_arity() == 0)));
109}

◆ 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 65 of file Literal.cpp.

65 {
66 #ifdef DEBUGMESSAGES
67 if (pred == nullptr)
68 cerr << "You shouldn't be making copies of empty Literals" << endl;
69 #endif
70 unordered_map<Variable*,Term*> new_vars;
71 return make_copy_with_new_vars_helper(vi, ti, new_vars);
72}
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}
Basic representation of literals, bundling together (pointers to) a Predicate, a collection of argume...
Definition Literal.hpp:50

◆ 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 58 of file Literal.cpp.

60 {
61 for (size_t i = 0; i < arity; i++)
62 args[i] = args[i]->make_copy_with_new_vars_helper(vi, ti, new_vars);
63}

◆ make_empty()

void Literal::make_empty ( )
inline

Basic manipulation - entirely self-explanatory.

Definition at line 111 of file Literal.hpp.

111{ pred = nullptr; }

◆ 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 236 of file Literal.cpp.

236 {
237 string s;
238 if (!polarity)
239 s += "\\neg ";
240 s += pred->make_LaTeX();
241 if (arity > 0) {
242 s += "(";
243 commas::comma com(arity);
244 for (Term* p : args) {
245 s += p->make_LaTeX(subbed);
246 s += com();
247 }
248 s += ")";
249 }
250 return s;
251}
string make_LaTeX() const
Make a useable LaTeX version.
Definition Predicate.cpp:32
Simple function object for putting commas in lists.

◆ 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 130 of file Literal.cpp.

130 {
131 #ifdef DEBUGMESSAGES
132 if (pred == nullptr || l.pred == nullptr) {
133 cerr << "You shouldn't be checking equality of empty Literals" << endl;
134 }
135 #endif
136 return (pred == l.pred &&
137 args == l.args &&
138 arity == l.arity &&
139 polarity == l.polarity);
140}

◆ 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 253 of file Literal.cpp.

254 {
255#ifdef DEBUGMESSAGES
256 if (pred == nullptr)
257 cerr << "You shouldn't be replacing variables in an empty Literal" << endl;
258#endif
259 for (size_t i = 0; i < arity; i++) {
260 args[i] = ti->replace_variable_in_term(new_var, old_var, args[i]);
261 }
262}
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 264 of file Literal.cpp.

265 {
266#ifdef DEBUGMESSAGES
267 if (pred == nullptr)
268 cerr << "You shouldn't be subbing terms in an empty Literal" << endl;
269#endif
270 for (size_t i = 0; i < arity; i++) {
271 args[i] = ti->replace_variable_in_term_with_term(new_term, old_var, args[i]);
272 }
273}
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 142 of file Literal.cpp.

142 {
143 #ifdef DEBUGMESSAGES
144 if (pred == nullptr || l->pred == nullptr) {
145 cerr << "You shouldn't be checking subbed equality of empty Literals" << endl;
146 }
147 #endif
148 if (!is_compatible_with(l)) {
149 return false;
150 }
151 for (size_t i = 0; i < arity; i++) {
152 if (!(args[i]->subbed_equal((l->args)[i])))
153 return false;
154 }
155 return true;
156}
bool is_compatible_with(const Literal *) const
Literals can only be unified if the polarity and actual predicate are the same.
Definition Literal.cpp:74
bool subbed_equal(Literal *) const
Equality, taking account of substitutions.
Definition Literal.cpp:142

◆ 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 186 of file Literal.cpp.

186 {
187 string result;
188 if (!polarity)
189 result += "-";
190 string name = pred->get_name();
191 if (name == "=")
192 name = "equal";
193 result += name;
194 if (arity > 0) {
195 result += "(";
196 commas::comma com(args.size());
197 for (Term* p : args) {
198 result += p->to_prolog_string();
199 result += com();
200 }
201 result += ")";
202 }
203 return result;
204}

◆ to_string()

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

Full conversion of Literal to string.

Parameters
subbedImplement substitutions if true.

Definition at line 166 of file Literal.cpp.

166 {
167 string result("Empty literal");
168 if (!is_empty()) {
169 if (pred->get_name() == string("=")) {
170 result = "( ";
171 result += args[0]->to_string(subbed);
172 result += " ";
173 result += polarity ? "=" : unicode_symbols::LogSym::neq;
174 result += " ";
175 result += args[1]->to_string(subbed);
176 result += " )";
177 }
178 else {
179 result = get_small_lit();
180 result += vector_to_string(args, subbed);
181 }
182 }
183 return result;
184}
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:158

◆ to_tptp_string()

string Literal::to_tptp_string ( ) const

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

Does not apply substitutions.

Definition at line 206 of file Literal.cpp.

206 {
207 string result;
208 string name = pred->get_name();
209 if (name != "=") {
210 if (!polarity)
211 result += "~";
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 }
223 else {
224 result += "( ";
225 result += args[0]->to_prolog_string();
226 if (polarity)
227 result += " = ";
228 else
229 result += " != ";
230 result += args[1]->to_prolog_string();
231 result += ")";
232 }
233 return result;
234}

Friends And Related Symbol Documentation

◆ operator<<

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

Definition at line 275 of file Literal.cpp.

275 {
276 if (l.is_empty())
277 out << "Empty literal";
278 else {
279 if (!l.polarity)
280 out << unicode_symbols::LogSym::neg;
281 out << l.pred->to_string();
282 out << vector_to_string(l.args);
283 }
284 return out;
285}

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: