6 #ifndef SYMENGINE_LOGIC_H
7 #define SYMENGINE_LOGIC_H
14 typedef std::set<RCP<const Boolean>, RCPBasicKeyLess> set_boolean;
15 typedef std::vector<RCP<const Boolean>> vec_boolean;
21 virtual RCP<const Boolean> logical_not()
const;
34 hash_t __hash__()
const override;
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;
43 extern SYMENGINE_EXPORT RCP<const BooleanAtom> &boolTrue;
44 extern SYMENGINE_EXPORT RCP<const BooleanAtom> &boolFalse;
46 inline RCP<const BooleanAtom> boolean(
bool b)
48 return b ? boolTrue : boolFalse;
56 RCP<const Basic> expr_;
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;
75 RCP<const Boolean> contains(
const RCP<const Basic> &expr,
76 const RCP<const Set> &set);
78 typedef std::vector<std::pair<RCP<const Basic>, RCP<const Boolean>>>
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;
103 SYMENGINE_EXPORT RCP<const Basic> piecewise(
const PiecewiseVec &vec);
108 set_boolean container_;
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;
128 set_boolean container_;
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;
147 RCP<const Boolean> arg_;
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;
166 vec_boolean container_;
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;
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;
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;
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;
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;
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;
233 inline bool is_a_Relational(
const Basic &b)
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);
241 inline bool is_a_Boolean(
const Basic &b)
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));
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);
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);
The base class for SymEngine.
#define IMPLEMENT_TYPEID(SYMENGINE_ID)
Inline members and functions.
The lowest unit of symbolic representation.
Main namespace for SymEngine package.
RCP< const Boolean > Le(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs)
Returns the canonicalized LessThan object from the arguments.
RCP< const Boolean > Ge(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs)
Convenience function returning LessThan object.
RCP< const Boolean > Eq(const RCP< const Basic > &lhs)
Returns the canonicalized Equality object from a single argument.
RCP< const Boolean > Gt(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs)
Convenience function returning StrictLessThan object.
RCP< const Boolean > Ne(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs)
Returns the canonicalized Unequality object from the arguments.
RCP< const Boolean > Lt(const RCP< const Basic > &lhs, const RCP< const Basic > &rhs)
Returns the canonicalized StrictLessThan object from the arguments.