Loading...
Searching...
No Matches
logic.h
Go to the documentation of this file.
1
6#ifndef SYMENGINE_LOGIC_H
7#define SYMENGINE_LOGIC_H
8
9#include <symengine/basic.h>
10#include <symengine/sets.h>
11
12namespace SymEngine
13{
14typedef std::set<RCP<const Boolean>, RCPBasicKeyLess> set_boolean;
15typedef std::vector<RCP<const Boolean>> vec_boolean;
16
17// Parent class for expressing boolean statements
18class Boolean : public Basic
19{
20public:
21 virtual RCP<const Boolean> logical_not() const;
22};
23
24// Booleans True and False
25class BooleanAtom : public Boolean
26{
27private:
28 bool b_;
29
30public:
32 BooleanAtom(bool b);
34 hash_t __hash__() const override;
35 bool get_val() const;
36 vec_basic get_args() const override;
37 bool __eq__(const Basic &o) const override;
39 int compare(const Basic &o) const override;
40 RCP<const Boolean> logical_not() const override;
41};
42
45
46inline RCP<const BooleanAtom> boolean(bool b)
47{
48 return b ? boolTrue : boolFalse;
49}
50
51// Represents `expr_` is inside set `set_`
52// `set_` can be any `Set` including `Interval`, `FiniteSet`
53class Contains : public Boolean
54{
55private:
56 RCP<const Basic> expr_;
57 RCP<const Set> set_;
58
59public:
62 Contains(const RCP<const Basic> &expr, const RCP<const Set> &set);
63 hash_t __hash__() const override;
64 RCP<const Basic> get_expr() const;
65 RCP<const Set> get_set() const;
66 vec_basic get_args() const override;
67 bool __eq__(const Basic &o) const override;
68 RCP<const Basic> create(const RCP<const Basic> &lhs,
69 const RCP<const Set> &rhs) const;
71 int compare(const Basic &o) const override;
72};
73
74RCP<const Boolean> contains(const RCP<const Basic> &expr,
75 const RCP<const Set> &set);
76
77typedef std::vector<std::pair<RCP<const Basic>, RCP<const Boolean>>>
79
80// Represents a piecewise function
81// Keeps a vector of (Expr, Condition) pairs
82class Piecewise : public Basic
83{
84private:
85 PiecewiseVec vec_;
86
87public:
91 bool is_canonical(const PiecewiseVec &vec);
92 hash_t __hash__() const override;
93 const PiecewiseVec &get_vec() const;
94 vec_basic get_args() const override;
95 bool __eq__(const Basic &o) const override;
97 int compare(const Basic &o) const override;
98};
99
100// Vec is vector of pairs of RCP<const Basic> and RCP<const Boolean> to
101// represent (Expr, Condition) pairs
102RCP<const Basic> piecewise(const PiecewiseVec &vec);
103
104class And : public Boolean
105{
106private:
107 set_boolean container_;
108
109public:
111 And(const set_boolean &s);
112 bool is_canonical(const set_boolean &container_);
114 hash_t __hash__() const override;
115 vec_basic get_args() const override;
116 RCP<const Basic> create(const set_boolean &a) const;
117 bool __eq__(const Basic &o) const override;
119 int compare(const Basic &o) const override;
120 const set_boolean &get_container() const;
121 RCP<const Boolean> logical_not() const override;
122};
123
124class Or : public Boolean
125{
126private:
127 set_boolean container_;
128
129public:
131 Or(const set_boolean &s);
132 bool is_canonical(const set_boolean &container_);
134 hash_t __hash__() const override;
135 vec_basic get_args() const override;
136 bool __eq__(const Basic &o) const override;
138 int compare(const Basic &o) const override;
139 const set_boolean &get_container() const;
140 RCP<const Boolean> logical_not() const override;
141};
142
143class Not : public Boolean
144{
145private:
146 RCP<const Boolean> arg_;
147
148public:
150 Not(const RCP<const Boolean> &s);
151 bool is_canonical(const RCP<const Boolean> &s);
153 hash_t __hash__() const override;
154 vec_basic get_args() const override;
155 bool __eq__(const Basic &o) const override;
157 int compare(const Basic &o) const override;
158 RCP<const Boolean> get_arg() const;
159 RCP<const Boolean> logical_not() const override;
160};
161
162class Xor : public Boolean
163{
164private:
165 vec_boolean container_;
166
167public:
169 Xor(const vec_boolean &s);
170 bool is_canonical(const vec_boolean &container_);
171 hash_t __hash__() const override;
172 vec_basic get_args() const override;
173 bool __eq__(const Basic &o) const override;
174 int compare(const Basic &o) const override;
175 const vec_boolean &get_container() const;
176};
177
178class Relational : public TwoArgBasic<Boolean>
179{
180public:
182 Relational(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
184 virtual bool is_canonical(const RCP<const Basic> &lhs,
185 const RCP<const Basic> &rhs) const;
186};
187
188class Equality : public Relational
189{
191public:
193 Equality(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
194 RCP<const Basic> create(const RCP<const Basic> &lhs,
195 const RCP<const Basic> &rhs) const override;
196 RCP<const Boolean> logical_not() const override;
197};
198
199class Unequality : public Relational
200{
202public:
204 Unequality(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
205 RCP<const Basic> create(const RCP<const Basic> &lhs,
206 const RCP<const Basic> &rhs) const override;
207 RCP<const Boolean> logical_not() const override;
208};
209
210class LessThan : public Relational
211{
213public:
215 LessThan(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
216 RCP<const Basic> create(const RCP<const Basic> &lhs,
217 const RCP<const Basic> &rhs) const override;
218 RCP<const Boolean> logical_not() const override;
219};
220
222{
224public:
226 StrictLessThan(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
227 RCP<const Basic> create(const RCP<const Basic> &lhs,
228 const RCP<const Basic> &rhs) const override;
229 RCP<const Boolean> logical_not() const override;
230};
231
232inline bool is_a_Relational(const Basic &b)
233{
234 return (b.get_type_code() == SYMENGINE_EQUALITY
235 || b.get_type_code() == SYMENGINE_UNEQUALITY
236 || b.get_type_code() == SYMENGINE_LESSTHAN
237 || b.get_type_code() == SYMENGINE_STRICTLESSTHAN);
238}
239
240inline bool is_a_Boolean(const Basic &b)
241{
242 return (b.get_type_code() == SYMENGINE_BOOLEAN_ATOM
243 || b.get_type_code() == SYMENGINE_CONTAINS
244 || b.get_type_code() == SYMENGINE_AND
245 || b.get_type_code() == SYMENGINE_OR
246 || b.get_type_code() == SYMENGINE_NOT
247 || b.get_type_code() == SYMENGINE_XOR || is_a_Relational(b));
248}
249
251RCP<const Boolean> Eq(const RCP<const Basic> &lhs);
253RCP<const Boolean> Eq(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
255RCP<const Boolean> Ne(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
257RCP<const Boolean> Ge(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
259RCP<const Boolean> Gt(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
261RCP<const Boolean> Le(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
263RCP<const Boolean> Lt(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
264
265RCP<const Boolean> logical_and(const set_boolean &s);
266RCP<const Boolean> logical_nand(const set_boolean &s);
267RCP<const Boolean> logical_or(const set_boolean &s);
268RCP<const Boolean> logical_not(const RCP<const Boolean> &s);
269RCP<const Boolean> logical_nor(const set_boolean &s);
270RCP<const Boolean> logical_xor(const vec_boolean &s);
271RCP<const Boolean> logical_xnor(const vec_boolean &s);
272} // namespace SymEngine
273
274#endif
The base class for SymEngine.
#define IMPLEMENT_TYPEID(SYMENGINE_ID)
Inline members and functions.
Definition basic.h:340
hash_t __hash__() const override
Definition logic.cpp:226
bool __eq__(const Basic &o) const override
Test equality.
Definition logic.cpp:240
int compare(const Basic &o) const override
Structural equality comparator.
Definition logic.cpp:247
vec_basic get_args() const override
Returns the list of arguments.
Definition logic.cpp:234
The lowest unit of symbolic representation.
Definition basic.h:97
vec_basic get_args() const override
Returns the list of arguments.
Definition logic.cpp:26
hash_t __hash__() const override
Definition logic.cpp:14
bool __eq__(const Basic &o) const override
Test equality.
Definition logic.cpp:31
int compare(const Basic &o) const override
Structural equality comparator.
Definition logic.cpp:37
bool __eq__(const Basic &o) const override
Test equality.
Definition logic.cpp:93
int compare(const Basic &o) const override
Structural equality comparator.
Definition logic.cpp:100
vec_basic get_args() const override
Returns the list of arguments.
Definition logic.cpp:85
hash_t __hash__() const override
Definition logic.cpp:67
RCP< const Basic > create(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs) const override
Method to construct classes with canonicalization.
Definition logic.cpp:642
RCP< const Basic > create(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs) const override
Method to construct classes with canonicalization.
Definition logic.cpp:711
vec_basic get_args() const override
Returns the list of arguments.
Definition logic.cpp:363
int compare(const Basic &o) const override
Structural equality comparator.
Definition logic.cpp:375
hash_t __hash__() const override
Definition logic.cpp:356
bool __eq__(const Basic &o) const override
Test equality.
Definition logic.cpp:370
vec_basic get_args() const override
Returns the list of arguments.
Definition logic.cpp:302
hash_t __hash__() const override
Definition logic.cpp:294
bool __eq__(const Basic &o) const override
Test equality.
Definition logic.cpp:308
int compare(const Basic &o) const override
Structural equality comparator.
Definition logic.cpp:314
vec_basic get_args() const override
Returns the list of arguments.
Definition logic.cpp:197
bool __eq__(const Basic &o) const override
Test equality.
Definition logic.cpp:207
int compare(const Basic &o) const override
Structural equality comparator.
Definition logic.cpp:213
hash_t __hash__() const override
Definition logic.cpp:182
virtual bool is_canonical(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs) const
Definition logic.cpp:623
RCP< const Basic > create(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs) const override
Method to construct classes with canonicalization.
Definition logic.cpp:757
RCP< const Basic > create(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs) const override
Method to construct classes with canonicalization.
Definition logic.cpp:682
bool __eq__(const Basic &o) const override
Test equality.
Definition logic.cpp:418
hash_t __hash__() const override
Definition logic.cpp:404
int compare(const Basic &o) const override
Definition logic.cpp:425
vec_basic get_args() const override
Returns the list of arguments.
Definition logic.cpp:412
Main namespace for SymEngine package.
Definition add.cpp:19
RCP< const Boolean > Ge(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs)
Convenience function returning LessThan object.
Definition logic.cpp:744
RCP< const Boolean > Lt(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs)
Returns the canonicalized StrictLessThan object from the arguments.
Definition logic.cpp:768
void hash_combine(hash_t &seed, const T &v)
Definition basic-inl.h:95
RCP< const Boolean > Le(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs)
Returns the canonicalized LessThan object from the arguments.
Definition logic.cpp:722
RCP< const Boolean > Eq(const RCP< const Basic > &lhs)
Returns the canonicalized Equality object from a single argument.
Definition logic.cpp:653
RCP< const Boolean > Gt(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs)
Convenience function returning StrictLessThan object.
Definition logic.cpp:790
RCP< const Boolean > Ne(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs)
Returns the canonicalized Unequality object from the arguments.
Definition logic.cpp:693