Connect++ 0.5.0
A fast, readable connection prover for first-order logic.
Loading...
Searching...
No Matches
Literal.cpp
1/*
2
3Copyright © 2023-24 Sean Holden. All rights reserved.
4
5*/
6/*
7
8This file is part of Connect++.
9
10Connect++ is free software: you can redistribute it and/or modify it
11under the terms of the GNU General Public License as published by the
12Free Software Foundation, either version 3 of the License, or (at your
13option) any later version.
14
15Connect++ is distributed in the hope that it will be useful, but WITHOUT
16ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
18more details.
19
20You should have received a copy of the GNU General Public License along
21with Connect++. If not, see <https://www.gnu.org/licenses/>.
22
23*/
24
25#include "Literal.hpp"
26
27//----------------------------------------------------------------------
28Literal::Literal(Predicate* new_p,
29 const vector<Term*>& new_args,
30 Arity new_ar,
31 bool new_pol)
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}
47//----------------------------------------------------------------------
49 TermIndex& ti,
50 unordered_map<Variable*,Term*>& new_vars) const {
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}
57//----------------------------------------------------------------------
59 #ifdef DEBUGMESSAGES
60 if (pred == nullptr)
61 cerr << "You shouldn't be making copies of empty Literals" << endl;
62 #endif
63 unordered_map<Variable*,Term*> new_vars;
64 return make_copy_with_new_vars_helper(vi, ti, new_vars);
65}
66//----------------------------------------------------------------------
68 #ifdef DEBUGMESSAGES
69 if (pred == nullptr || l->pred == nullptr) {
70 cerr << "You shouldn't be checking compatibility of empty Literals" << endl;
71 }
72 #endif
73 return (pred == l->pred &&
74 polarity == l->polarity &&
75 arity == l->arity);
76}
77//----------------------------------------------------------------------
78bool Literal::is_complement_of(const Literal& l) const {
79 return (pred == l.pred &&
80 args == l.args &&
81 arity == l.arity &&
82 !polarity == l.polarity);
83}
84//----------------------------------------------------------------------
85bool Literal::is_true() const {
86 return ((polarity &&
87 (pred->get_name() == string("$true")) &&
88 (pred->get_arity() == 0))
89 ||
90 (!polarity &&
91 (pred->get_name() == string("$false")) &&
92 (pred->get_arity() == 0)));
93}
94//----------------------------------------------------------------------
95bool Literal::is_false() const {
96 return ((polarity &&
97 (pred->get_name() == string("$false")) &&
98 (pred->get_arity() == 0))
99 ||
100 (!polarity &&
101 (pred->get_name() == string("$true")) &&
102 (pred->get_arity() == 0)));
103}
104//----------------------------------------------------------------------
106 for (size_t i = 0; i < args.size(); i++) {
107 // Note that this takes account of substitutions.
108 if (args[i]->contains_variable(v))
109 return true;
110 }
111 return false;
112}
113//----------------------------------------------------------------------
114bool Literal::operator==(const Literal& l) const {
115 #ifdef DEBUGMESSAGES
116 if (pred == nullptr || l.pred == nullptr) {
117 cerr << "You shouldn't be checking equality of empty Literals" << endl;
118 }
119 #endif
120 return (pred == l.pred &&
121 args == l.args &&
122 arity == l.arity &&
123 polarity == l.polarity);
124}
125//----------------------------------------------------------------------
127 #ifdef DEBUGMESSAGES
128 if (pred == nullptr || l->pred == nullptr) {
129 cerr << "You shouldn't be checking subbed equality of empty Literals" << endl;
130 }
131 #endif
132 if (!is_compatible_with(l)) {
133 return false;
134 }
135 for (size_t i = 0; i < arity; i++) {
136 if (!(args[i]->subbed_equal((l->args)[i])))
137 return false;
138 }
139 return true;
140}
141//----------------------------------------------------------------------
143 string result;
144 if (!polarity)
145 result += unicode_symbols::LogSym::neg;
146 result += pred->to_string();
147 return result;
148}
149//----------------------------------------------------------------------
150string Literal::to_string(bool subbed) const {
151 string result("Empty literal");
152 if (!is_empty()) {
153 result = get_small_lit();
154 result += vector_to_string(args, subbed);
155 }
156 return result;
157}
158//----------------------------------------------------------------------
160 string result;
161 if (!polarity)
162 result += "-";
163 string name = pred->get_name();
164 if (name == "=")
165 name = "equal";
166 result += name;
167 if (arity > 0) {
168 result += "(";
169 commas::comma com(args.size());
170 for (Term* p : args) {
171 result += p->to_prolog_string();
172 result += com();
173 }
174 result += ")";
175 }
176 return result;
177}
178//----------------------------------------------------------------------
180 string result;
181 string name = pred->get_name();
182 if (name != "=") {
183 if (!polarity)
184 result += "~";
185 result += name;
186 if (arity > 0) {
187 result += "(";
188 commas::comma com(args.size());
189 for (Term* p : args) {
190 result += p->to_prolog_string();
191 result += com();
192 }
193 result += ")";
194 }
195 }
196 else {
197 result += "( ";
198 result += args[0]->to_prolog_string();
199 if (polarity)
200 result += " = ";
201 else
202 result += " != ";
203 result += args[1]->to_prolog_string();
204 result += ")";
205 }
206 return result;
207}
208//----------------------------------------------------------------------
209string Literal::make_LaTeX(bool subbed) const {
210 string s;
211 if (!polarity)
212 s += "\\neg ";
213 s += pred->make_LaTeX();
214 if (arity > 0) {
215 s += "(";
216 commas::comma com(arity);
217 for (Term* p : args) {
218 s += p->make_LaTeX(subbed);
219 s += com();
220 }
221 s += ")";
222 }
223 return s;
224}
225//----------------------------------------------------------------------
227 TermIndex* ti) {
228#ifdef DEBUGMESSAGES
229 if (pred == nullptr)
230 cerr << "You shouldn't be replacing variables in an empty Literal" << endl;
231#endif
232 for (size_t i = 0; i < arity; i++) {
233 args[i] = ti->replace_variable_in_term(new_var, old_var, args[i]);
234 }
235}
236//----------------------------------------------------------------------
238 TermIndex* ti) {
239#ifdef DEBUGMESSAGES
240 if (pred == nullptr)
241 cerr << "You shouldn't be subbing terms in an empty Literal" << endl;
242#endif
243 for (size_t i = 0; i < arity; i++) {
244 args[i] = ti->replace_variable_in_term_with_term(new_term, old_var, args[i]);
245 }
246}
247//----------------------------------------------------------------------
248ostream& operator<<(ostream& out, const Literal& l) {
249 if (l.is_empty())
250 out << "Empty literal";
251 else {
252 if (!l.polarity)
253 out << unicode_symbols::LogSym::neg;
254 out << l.pred->to_string();
255 out << vector_to_string(l.args);
256 }
257 return out;
258}
Basic representation of literals, bundling together (pointers to) a Predicate, a collection of argume...
Definition Literal.hpp:50
bool is_false() const
Is this equivalent to $false?
Definition Literal.cpp:95
void replace_variable_with_term(Term *, Variable *, TermIndex *)
Replace one variable with a term throughout.
Definition Literal.cpp:237
string to_string(bool=false) const
Full conversion of Literal to string.
Definition Literal.cpp:150
bool is_empty() const
Basic manipulation - entirely self-explanatory.
Definition Literal.hpp:111
string make_LaTeX(bool=false) const
Make a useable LaTeX version.
Definition Literal.cpp:209
bool contains_variable(Variable *) const
Does this Literal contain the specified variable?
Definition Literal.cpp:105
void replace_variable(Variable *, Variable *, TermIndex *)
Replace one variable with another throughout.
Definition Literal.cpp:226
string to_tptp_string() const
Convert to a string in a format compatible with the TPTP.
Definition Literal.cpp:179
bool is_complement_of(const Literal &) const
Test whether one literal is exactly the same as another, with the exception of the polarity.
Definition Literal.cpp:78
bool is_compatible_with(const Literal *) const
Literals can only be unified if the polarity and actual predicate are the same.
Definition Literal.cpp:67
Literal make_copy_with_new_vars(VariableIndex &, TermIndex &) const
Make a copy of the Literal but with a new set of variables.
Definition Literal.cpp:58
bool operator==(const Literal &) const
Equality without taking account of substutions.
Definition Literal.cpp:114
bool is_true() const
Is this equivalent to $true?
Definition Literal.cpp:85
string get_small_lit() const
Get the predicate and polarity as a string.
Definition Literal.cpp:142
bool subbed_equal(Literal *) const
Equality, taking account of substitutions.
Definition Literal.cpp:126
string to_prolog_string() const
Convert to a string in a format readable by Prolog.
Definition Literal.cpp:159
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
Basic representation of predicates: here just names, ids and arities.
Definition Predicate.hpp:51
Arity get_arity() const
Basic get method.
Definition Predicate.hpp:90
string make_LaTeX() const
Make a useable LaTeX version.
Definition Predicate.cpp:32
string to_string() const
Converting to a string just gives you the name.
Definition Predicate.cpp:27
string get_name() const
Basic get method.
Definition Predicate.hpp:86
General representation of terms.
Definition Term.hpp:62
Look after terms, (ideally) using hash consing to avoid storing copies of terms.
Definition TermIndex.hpp:75
Term * replace_variable_in_term_with_term(Term *, Variable *, Term *)
Minor variation on replace_variable_in_term.
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:93
Basic representation of variables.
Definition Variable.hpp:58
Storage of named variables, and management of new, anonymous and unique variables.
Simple function object for putting commas in lists.