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 
12 namespace SymEngine
13 {
14 typedef std::set<RCP<const Boolean>, RCPBasicKeyLess> set_boolean;
15 typedef std::vector<RCP<const Boolean>> vec_boolean;
16 
17 // Parent class for expressing boolean statements
18 class SYMENGINE_EXPORT Boolean : public Basic
19 {
20 public:
21  virtual RCP<const Boolean> logical_not() const;
22 };
23 
24 // Booleans True and False
25 class SYMENGINE_EXPORT BooleanAtom : public Boolean
26 {
27 private:
28  bool b_;
29 
30 public:
31  IMPLEMENT_TYPEID(SYMENGINE_BOOLEAN_ATOM)
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 
43 extern SYMENGINE_EXPORT RCP<const BooleanAtom> &boolTrue;
44 extern SYMENGINE_EXPORT RCP<const BooleanAtom> &boolFalse;
45 
46 inline 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`
53 class SYMENGINE_EXPORT Contains : public Boolean
54 {
55 private:
56  RCP<const Basic> expr_;
57  RCP<const Set> set_;
58 
59 public:
60  IMPLEMENT_TYPEID(SYMENGINE_CONTAINS)
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 
74 SYMENGINE_EXPORT
75 RCP<const Boolean> contains(const RCP<const Basic> &expr,
76  const RCP<const Set> &set);
77 
78 typedef std::vector<std::pair<RCP<const Basic>, RCP<const Boolean>>>
79  PiecewiseVec;
80 
81 // Represents a piecewise function
82 // Keeps a vector of (Expr, Condition) pairs
83 class SYMENGINE_EXPORT Piecewise : public Basic
84 {
85 private:
86  PiecewiseVec vec_;
87 
88 public:
89  IMPLEMENT_TYPEID(SYMENGINE_PIECEWISE)
91  Piecewise(PiecewiseVec &&vec);
92  bool is_canonical(const PiecewiseVec &vec);
93  hash_t __hash__() const override;
94  const PiecewiseVec &get_vec() const;
95  vec_basic get_args() const override;
96  bool __eq__(const Basic &o) const override;
98  int compare(const Basic &o) const override;
99 };
100 
101 // Vec is vector of pairs of RCP<const Basic> and RCP<const Boolean> to
102 // represent (Expr, Condition) pairs
103 SYMENGINE_EXPORT RCP<const Basic> piecewise(const PiecewiseVec &vec);
104 
105 class SYMENGINE_EXPORT And : public Boolean
106 {
107 private:
108  set_boolean container_;
109 
110 public:
111  IMPLEMENT_TYPEID(SYMENGINE_AND)
112  And(const set_boolean &s);
113  bool is_canonical(const set_boolean &container_);
115  hash_t __hash__() const override;
116  vec_basic get_args() const override;
117  RCP<const Basic> create(const set_boolean &a) const;
118  bool __eq__(const Basic &o) const override;
120  int compare(const Basic &o) const override;
121  const set_boolean &get_container() const;
122  RCP<const Boolean> logical_not() const override;
123 };
124 
125 class SYMENGINE_EXPORT Or : public Boolean
126 {
127 private:
128  set_boolean container_;
129 
130 public:
131  IMPLEMENT_TYPEID(SYMENGINE_OR)
132  Or(const set_boolean &s);
133  bool is_canonical(const set_boolean &container_);
135  hash_t __hash__() const override;
136  vec_basic get_args() const override;
137  bool __eq__(const Basic &o) const override;
139  int compare(const Basic &o) const override;
140  const set_boolean &get_container() const;
141  RCP<const Boolean> logical_not() const override;
142 };
143 
144 class SYMENGINE_EXPORT Not : public Boolean
145 {
146 private:
147  RCP<const Boolean> arg_;
148 
149 public:
150  IMPLEMENT_TYPEID(SYMENGINE_NOT)
151  Not(const RCP<const Boolean> &s);
152  bool is_canonical(const RCP<const Boolean> &s);
154  hash_t __hash__() const override;
155  vec_basic get_args() const override;
156  bool __eq__(const Basic &o) const override;
158  int compare(const Basic &o) const override;
159  RCP<const Boolean> get_arg() const;
160  RCP<const Boolean> logical_not() const override;
161 };
162 
163 class SYMENGINE_EXPORT Xor : public Boolean
164 {
165 private:
166  vec_boolean container_;
167 
168 public:
169  IMPLEMENT_TYPEID(SYMENGINE_XOR)
170  Xor(const vec_boolean &s);
171  bool is_canonical(const vec_boolean &container_);
172  hash_t __hash__() const override;
173  vec_basic get_args() const override;
174  bool __eq__(const Basic &o) const override;
175  int compare(const Basic &o) const override;
176  const vec_boolean &get_container() const;
177 };
178 
179 class SYMENGINE_EXPORT Relational : public TwoArgBasic<Boolean>
180 {
181 public:
183  Relational(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
185  virtual bool is_canonical(const RCP<const Basic> &lhs,
186  const RCP<const Basic> &rhs) const;
187 };
188 
189 class SYMENGINE_EXPORT Equality : public Relational
190 {
192 public:
193  IMPLEMENT_TYPEID(SYMENGINE_EQUALITY)
194  Equality(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
195  RCP<const Basic> create(const RCP<const Basic> &lhs,
196  const RCP<const Basic> &rhs) const override;
197  RCP<const Boolean> logical_not() const override;
198 };
199 
200 class SYMENGINE_EXPORT Unequality : public Relational
201 {
203 public:
204  IMPLEMENT_TYPEID(SYMENGINE_UNEQUALITY)
205  Unequality(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
206  RCP<const Basic> create(const RCP<const Basic> &lhs,
207  const RCP<const Basic> &rhs) const override;
208  RCP<const Boolean> logical_not() const override;
209 };
210 
211 class SYMENGINE_EXPORT LessThan : public Relational
212 {
214 public:
215  IMPLEMENT_TYPEID(SYMENGINE_LESSTHAN)
216  LessThan(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
217  RCP<const Basic> create(const RCP<const Basic> &lhs,
218  const RCP<const Basic> &rhs) const override;
219  RCP<const Boolean> logical_not() const override;
220 };
221 
222 class SYMENGINE_EXPORT StrictLessThan : public Relational
223 {
225 public:
226  IMPLEMENT_TYPEID(SYMENGINE_STRICTLESSTHAN)
227  StrictLessThan(const RCP<const Basic> &lhs, const RCP<const Basic> &rhs);
228  RCP<const Basic> create(const RCP<const Basic> &lhs,
229  const RCP<const Basic> &rhs) const override;
230  RCP<const Boolean> logical_not() const override;
231 };
232 
233 inline bool is_a_Relational(const Basic &b)
234 {
235  return (b.get_type_code() == SYMENGINE_EQUALITY
236  || b.get_type_code() == SYMENGINE_UNEQUALITY
237  || b.get_type_code() == SYMENGINE_LESSTHAN
238  || b.get_type_code() == SYMENGINE_STRICTLESSTHAN);
239 }
240 
241 inline bool is_a_Boolean(const Basic &b)
242 {
243  return (b.get_type_code() == SYMENGINE_BOOLEAN_ATOM
244  || b.get_type_code() == SYMENGINE_CONTAINS
245  || b.get_type_code() == SYMENGINE_AND
246  || b.get_type_code() == SYMENGINE_OR
247  || b.get_type_code() == SYMENGINE_NOT
248  || b.get_type_code() == SYMENGINE_XOR || is_a_Relational(b));
249 }
250 
252 SYMENGINE_EXPORT RCP<const Boolean> Eq(const RCP<const Basic> &lhs);
254 SYMENGINE_EXPORT RCP<const Boolean> Eq(const RCP<const Basic> &lhs,
255  const RCP<const Basic> &rhs);
257 SYMENGINE_EXPORT RCP<const Boolean> Ne(const RCP<const Basic> &lhs,
258  const RCP<const Basic> &rhs);
260 SYMENGINE_EXPORT RCP<const Boolean> Ge(const RCP<const Basic> &lhs,
261  const RCP<const Basic> &rhs);
263 SYMENGINE_EXPORT RCP<const Boolean> Gt(const RCP<const Basic> &lhs,
264  const RCP<const Basic> &rhs);
266 SYMENGINE_EXPORT RCP<const Boolean> Le(const RCP<const Basic> &lhs,
267  const RCP<const Basic> &rhs);
269 SYMENGINE_EXPORT RCP<const Boolean> Lt(const RCP<const Basic> &lhs,
270  const RCP<const Basic> &rhs);
271 
272 SYMENGINE_EXPORT RCP<const Boolean> logical_and(const set_boolean &s);
273 SYMENGINE_EXPORT RCP<const Boolean> logical_nand(const set_boolean &s);
274 SYMENGINE_EXPORT RCP<const Boolean> logical_or(const set_boolean &s);
275 SYMENGINE_EXPORT RCP<const Boolean> logical_not(const RCP<const Boolean> &s);
276 SYMENGINE_EXPORT RCP<const Boolean> logical_nor(const set_boolean &s);
277 SYMENGINE_EXPORT RCP<const Boolean> logical_xor(const vec_boolean &s);
278 SYMENGINE_EXPORT RCP<const Boolean> logical_xnor(const vec_boolean &s);
279 } // namespace SymEngine
280 
281 #endif
The base class for SymEngine.
#define IMPLEMENT_TYPEID(SYMENGINE_ID)
Inline members and functions.
Definition: basic.h:344
The lowest unit of symbolic representation.
Definition: basic.h:97
Main namespace for SymEngine package.
Definition: add.cpp:19
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:711
RCP< const Boolean > Ge(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs)
Convenience function returning LessThan object.
Definition: logic.cpp:733
RCP< const Boolean > Eq(const RCP< const Basic > &lhs)
Returns the canonicalized Equality object from a single argument.
Definition: logic.cpp:642
RCP< const Boolean > Gt(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs)
Convenience function returning StrictLessThan object.
Definition: logic.cpp:779
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:682
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:757