test_rewriting.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. from sympy.combinatorics.fp_groups import FpGroup
  2. from sympy.combinatorics.free_groups import free_group
  3. from sympy.testing.pytest import raises
  4. def test_rewriting():
  5. F, a, b = free_group("a, b")
  6. G = FpGroup(F, [a*b*a**-1*b**-1])
  7. a, b = G.generators
  8. R = G._rewriting_system
  9. assert R.is_confluent
  10. assert G.reduce(b**-1*a) == a*b**-1
  11. assert G.reduce(b**3*a**4*b**-2*a) == a**5*b
  12. assert G.equals(b**2*a**-1*b, b**4*a**-1*b**-1)
  13. assert R.reduce_using_automaton(b*a*a**2*b**-1) == a**3
  14. assert R.reduce_using_automaton(b**3*a**4*b**-2*a) == a**5*b
  15. assert R.reduce_using_automaton(b**-1*a) == a*b**-1
  16. G = FpGroup(F, [a**3, b**3, (a*b)**2])
  17. R = G._rewriting_system
  18. R.make_confluent()
  19. # R._is_confluent should be set to True after
  20. # a successful run of make_confluent
  21. assert R.is_confluent
  22. # but also the system should actually be confluent
  23. assert R._check_confluence()
  24. assert G.reduce(b*a**-1*b**-1*a**3*b**4*a**-1*b**-15) == a**-1*b**-1
  25. # check for automaton reduction
  26. assert R.reduce_using_automaton(b*a**-1*b**-1*a**3*b**4*a**-1*b**-15) == a**-1*b**-1
  27. G = FpGroup(F, [a**2, b**3, (a*b)**4])
  28. R = G._rewriting_system
  29. assert G.reduce(a**2*b**-2*a**2*b) == b**-1
  30. assert R.reduce_using_automaton(a**2*b**-2*a**2*b) == b**-1
  31. assert G.reduce(a**3*b**-2*a**2*b) == a**-1*b**-1
  32. assert R.reduce_using_automaton(a**3*b**-2*a**2*b) == a**-1*b**-1
  33. # Check after adding a rule
  34. R.add_rule(a**2, b)
  35. assert R.reduce_using_automaton(a**2*b**-2*a**2*b) == b**-1
  36. assert R.reduce_using_automaton(a**4*b**-2*a**2*b**3) == b
  37. R.set_max(15)
  38. raises(RuntimeError, lambda: R.add_rule(a**-3, b))
  39. R.set_max(20)
  40. R.add_rule(a**-3, b)
  41. assert R.add_rule(a, a) == set()