* Implementation of relations between expressions */
/*
- * GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2002 Johannes Gutenberg University Mainz, Germany
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
} else {
- if (precedence() <= level)
- c.s << "(";
- lh.print(c, precedence());
+ if (is_a<print_python_repr>(c)) {
+ c.s << class_name() << '(';
+ lh.print(c);
+ c.s << ',';
+ rh.print(c);
+ c.s << ",'";
+ } else {
+ if (precedence() <= level)
+ c.s << "(";
+ lh.print(c, precedence());
+ }
switch (o) {
case equal:
c.s << "==";
default:
c.s << "(INVALID RELATIONAL OPERATOR)";
}
- rh.print(c, precedence());
- if (precedence() <= level)
- c.s << ")";
+ if (is_a<print_python_repr>(c))
+ c.s << "')";
+ else {
+ rh.print(c, precedence());
+ if (precedence() <= level)
+ c.s << ")";
+ }
}
}
return (new relational(lh.eval(level-1),rh.eval(level-1),o))->setflag(status_flags::dynallocated | status_flags::evaluated);
}
+ex relational::subs(const lst & ls, const lst & lr, bool no_pattern) const
+{
+ const ex & subsed_lh = lh.subs(ls, lr, no_pattern);
+ const ex & subsed_rh = rh.subs(ls, lr, no_pattern);
+
+ if (!are_ex_trivially_equal(lh, subsed_lh) || !are_ex_trivially_equal(rh, subsed_rh))
+ return relational(subsed_lh, subsed_rh, o).basic::subs(ls, lr, no_pattern);
+ else
+ return basic::subs(ls, lr, no_pattern);
+}
+
ex relational::simplify_ncmul(const exvector & v) const
{
return lh.simplify_ncmul(v);
return v;
}
-bool relational::is_equal_same_type(const basic & other) const
-{
- GINAC_ASSERT(is_a<relational>(other));
- const relational &oth = static_cast<const relational &>(other);
- if (o==oth.o && lh.is_equal(oth.lh) && rh.is_equal(oth.rh))
- return true;
- switch (o) {
- case equal:
- case not_equal:
- if (oth.o!=o)
- return false;
- break;
- case less:
- if (oth.o!=greater)
- return false;
- break;
- case less_or_equal:
- if (oth.o!=greater_or_equal)
- return false;
- break;
- case greater:
- if (oth.o!=less)
- return false;
- break;
- case greater_or_equal:
- if (oth.o!=less_or_equal)
- return false;
- break;
- }
- return lh.is_equal(oth.rh) && rh.is_equal(oth.lh);
-}
-
-
//////////
// new virtual functions which can be overridden by derived classes
//////////