From 9b0a842373b29c3b8f0e85741f15ea2e00f0ed9b Mon Sep 17 00:00:00 2001 From: arihant parsoya Date: Fri, 29 Jul 2016 22:01:47 +0530 Subject: [PATCH 1/2] Changed printing of logic expressions Fix for #11435. Changed the functions _print_And() _print_Or() to print `&` and `|` symbols in the expressions instead of `And` and `Or`. Previously, printing module used its superclass to print `Not` expression. Hence, a new function _print_Not() is created to change the printing of `Not`expressions. Previous tests are modified to account for new changes. --- sympy/printing/str.py | 7 +++++-- sympy/printing/tests/test_str.py | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/sympy/printing/str.py b/sympy/printing/str.py index 528aab65cecd..cf4f60101d24 100644 --- a/sympy/printing/str.py +++ b/sympy/printing/str.py @@ -75,13 +75,16 @@ def _print_BooleanFalse(self, expr): return "False" def _print_And(self, expr): - return '%s(%s)' % (expr.func, ', '.join(sorted(self._print(a) for a in + return '(%s)' % (' & '.join(sorted(self._print(a) for a in expr.args))) def _print_Or(self, expr): - return '%s(%s)' % (expr.func, ', '.join(sorted(self._print(a) for a in + return '(%s)' % (' | '.join(sorted(self._print(a) for a in expr.args))) + def _print_Not(self, expr): + return '%s(%s)' % ('~', self._print(expr.args[0])) + def _print_AppliedPredicate(self, expr): return '%s(%s)' % (expr.func, expr.arg) diff --git a/sympy/printing/tests/test_str.py b/sympy/printing/tests/test_str.py index 0a7d538f4fe6..409dba1404b5 100644 --- a/sympy/printing/tests/test_str.py +++ b/sympy/printing/tests/test_str.py @@ -660,14 +660,14 @@ def test_settings(): def test_RandomDomain(): from sympy.stats import Normal, Die, Exponential, pspace, where X = Normal('x1', 0, 1) - assert str(where(X > 0)) == "Domain: And(0 < x1, x1 < oo)" + assert str(where(X > 0)) == "Domain: (0 < x1 & x1 < oo)" D = Die('d1', 6) - assert str(where(D > 4)) == "Domain: Or(Eq(d1, 5), Eq(d1, 6))" + assert str(where(D > 4)) == "Domain: (Eq(d1, 5) | Eq(d1, 6))" A = Exponential('a', 1) B = Exponential('b', 1) - assert str(pspace(Tuple(A, B)).domain) == "Domain: And(0 <= a, 0 <= b, a < oo, b < oo)" + assert str(pspace(Tuple(A, B)).domain) == "Domain: (0 <= a & 0 <= b & a < oo & b < oo)" def test_FiniteSet(): From 1986613a1b3cb166e2ba6769e70f6e958573589b Mon Sep 17 00:00:00 2001 From: arihant parsoya Date: Fri, 12 Aug 2016 20:44:33 +0530 Subject: [PATCH 2/2] Improved parenthesization in Logical Expressions used function parenthesize to manage parentheses in logical expressions. --- sympy/printing/str.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sympy/printing/str.py b/sympy/printing/str.py index cf4f60101d24..4f9138e8cd4e 100644 --- a/sympy/printing/str.py +++ b/sympy/printing/str.py @@ -75,15 +75,15 @@ def _print_BooleanFalse(self, expr): return "False" def _print_And(self, expr): - return '(%s)' % (' & '.join(sorted(self._print(a) for a in - expr.args))) + return '%s' % (' & '.join([self.parenthesize(arg, precedence(expr)) + for arg in expr.args])) def _print_Or(self, expr): - return '(%s)' % (' | '.join(sorted(self._print(a) for a in - expr.args))) + return '%s' % (' | '.join([self.parenthesize(arg, precedence(expr)) + for arg in expr.args])) def _print_Not(self, expr): - return '%s(%s)' % ('~', self._print(expr.args[0])) + return '%s%s' % ('~', self._print(expr.args[0])) def _print_AppliedPredicate(self, expr): return '%s(%s)' % (expr.func, expr.arg) @@ -122,11 +122,11 @@ def _print_Dict(self, expr): def _print_RandomDomain(self, d): try: - return 'Domain: ' + self._print(d.as_boolean()) + return 'Domain: (' + self._print(d.as_boolean()) + ')' except Exception: try: - return ('Domain: ' + self._print(d.symbols) + ' in ' + - self._print(d.set)) + return ('Domain: (' + self._print(d.symbols) + ' in ' + + self._print(d.set) + ')') except: return 'Domain on ' + self._print(d.symbols)