Explorar el Código

Implemented {match_,}multiply_one functions.

Sander Mathijs van Veen hace 14 años
padre
commit
63ab861b1c
Se han modificado 2 ficheros con 38 adiciones y 2 borrados
  1. 2 2
      src/rules/__init__.py
  2. 36 0
      src/rules/numerics.py

+ 2 - 2
src/rules/__init__.py

@@ -6,7 +6,7 @@ from .powers import match_add_exponents, match_subtract_exponents, \
         match_remove_negative_exponent, match_exponent_to_root, \
         match_extend_exponent, match_constant_exponent
 from .numerics import match_add_numerics, match_divide_numerics, \
-        match_multiply_numerics, match_multiply_zero
+        match_multiply_numerics, match_multiply_zero, match_multiply_one
 from .fractions import match_constant_division, match_add_constant_fractions, \
         match_expand_and_add_fractions
 from .negation import match_negated_factor, match_negate_polynome, \
@@ -17,7 +17,7 @@ RULES = {
                  match_combine_groups],
         OP_MUL: [match_multiply_numerics, match_expand, match_add_exponents,
                  match_expand_and_add_fractions, match_multiply_zero,
-                 match_negated_factor],
+                 match_negated_factor, match_multiply_one],
         OP_DIV: [match_subtract_exponents, match_divide_numerics,
                  match_constant_division, match_negated_division],
         OP_POW: [match_multiply_exponents, match_duplicate_exponent,

+ 36 - 0
src/rules/numerics.py

@@ -155,6 +155,42 @@ def multiply_zero(root, args):
 MESSAGES[multiply_zero] = _('Multiplication with zero yields zero.')
 
 
+def match_multiply_one(node):
+    """
+    a * 1    ->  a
+    1 * a    ->  a
+    -1 * a   ->  -a
+    1 * -a   ->  -a
+    -1 * -a  ->  a
+    """
+    assert node.is_op(OP_MUL)
+
+    left, right = node
+
+    if left.value == 1:
+        return [P(node, multiply_one, (right, left))]
+
+    if right.value == 1:
+        return [P(node, multiply_one, (left, right))]
+
+    return []
+
+
+def multiply_one(root, args):
+    """
+    a * 1  ->  a
+    1 * a  ->  a
+    -1 * a   ->  -a
+    1 * -a   ->  -a
+    -1 * -a  ->  a
+    """
+    a, one = args
+    return a.negate(one.negated + root.negated)
+
+
+MESSAGES[multiply_one] = _('Multiplication with one yields the multiplicant.')
+
+
 def match_multiply_numerics(node):
     """
     3 * 2      ->  6