test_logic.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. from sympy.core.logic import (fuzzy_not, Logic, And, Or, Not, fuzzy_and,
  2. fuzzy_or, _fuzzy_group, _torf, fuzzy_nand, fuzzy_xor)
  3. from sympy.testing.pytest import raises
  4. from itertools import product
  5. T = True
  6. F = False
  7. U = None
  8. def test_torf():
  9. v = [T, F, U]
  10. for i in product(*[v]*3):
  11. assert _torf(i) is (True if all(j for j in i) else
  12. (False if all(j is False for j in i) else None))
  13. def test_fuzzy_group():
  14. v = [T, F, U]
  15. for i in product(*[v]*3):
  16. assert _fuzzy_group(i) is (None if None in i else
  17. (True if all(j for j in i) else False))
  18. assert _fuzzy_group(i, quick_exit=True) is \
  19. (None if (i.count(False) > 1) else
  20. (None if None in i else (True if all(j for j in i) else False)))
  21. it = (True if (i == 0) else None for i in range(2))
  22. assert _torf(it) is None
  23. it = (True if (i == 1) else None for i in range(2))
  24. assert _torf(it) is None
  25. def test_fuzzy_not():
  26. assert fuzzy_not(T) == F
  27. assert fuzzy_not(F) == T
  28. assert fuzzy_not(U) == U
  29. def test_fuzzy_and():
  30. assert fuzzy_and([T, T]) == T
  31. assert fuzzy_and([T, F]) == F
  32. assert fuzzy_and([T, U]) == U
  33. assert fuzzy_and([F, F]) == F
  34. assert fuzzy_and([F, U]) == F
  35. assert fuzzy_and([U, U]) == U
  36. assert [fuzzy_and([w]) for w in [U, T, F]] == [U, T, F]
  37. assert fuzzy_and([T, F, U]) == F
  38. assert fuzzy_and([]) == T
  39. raises(TypeError, lambda: fuzzy_and())
  40. def test_fuzzy_or():
  41. assert fuzzy_or([T, T]) == T
  42. assert fuzzy_or([T, F]) == T
  43. assert fuzzy_or([T, U]) == T
  44. assert fuzzy_or([F, F]) == F
  45. assert fuzzy_or([F, U]) == U
  46. assert fuzzy_or([U, U]) == U
  47. assert [fuzzy_or([w]) for w in [U, T, F]] == [U, T, F]
  48. assert fuzzy_or([T, F, U]) == T
  49. assert fuzzy_or([]) == F
  50. raises(TypeError, lambda: fuzzy_or())
  51. def test_logic_cmp():
  52. l1 = And('a', Not('b'))
  53. l2 = And('a', Not('b'))
  54. assert hash(l1) == hash(l2)
  55. assert (l1 == l2) == T
  56. assert (l1 != l2) == F
  57. assert And('a', 'b', 'c') == And('b', 'a', 'c')
  58. assert And('a', 'b', 'c') == And('c', 'b', 'a')
  59. assert And('a', 'b', 'c') == And('c', 'a', 'b')
  60. assert Not('a') < Not('b')
  61. assert (Not('b') < Not('a')) is False
  62. assert (Not('a') < 2) is False
  63. def test_logic_onearg():
  64. assert And() is True
  65. assert Or() is False
  66. assert And(T) == T
  67. assert And(F) == F
  68. assert Or(T) == T
  69. assert Or(F) == F
  70. assert And('a') == 'a'
  71. assert Or('a') == 'a'
  72. def test_logic_xnotx():
  73. assert And('a', Not('a')) == F
  74. assert Or('a', Not('a')) == T
  75. def test_logic_eval_TF():
  76. assert And(F, F) == F
  77. assert And(F, T) == F
  78. assert And(T, F) == F
  79. assert And(T, T) == T
  80. assert Or(F, F) == F
  81. assert Or(F, T) == T
  82. assert Or(T, F) == T
  83. assert Or(T, T) == T
  84. assert And('a', T) == 'a'
  85. assert And('a', F) == F
  86. assert Or('a', T) == T
  87. assert Or('a', F) == 'a'
  88. def test_logic_combine_args():
  89. assert And('a', 'b', 'a') == And('a', 'b')
  90. assert Or('a', 'b', 'a') == Or('a', 'b')
  91. assert And(And('a', 'b'), And('c', 'd')) == And('a', 'b', 'c', 'd')
  92. assert Or(Or('a', 'b'), Or('c', 'd')) == Or('a', 'b', 'c', 'd')
  93. assert Or('t', And('n', 'p', 'r'), And('n', 'r'), And('n', 'p', 'r'), 't',
  94. And('n', 'r')) == Or('t', And('n', 'p', 'r'), And('n', 'r'))
  95. def test_logic_expand():
  96. t = And(Or('a', 'b'), 'c')
  97. assert t.expand() == Or(And('a', 'c'), And('b', 'c'))
  98. t = And(Or('a', Not('b')), 'b')
  99. assert t.expand() == And('a', 'b')
  100. t = And(Or('a', 'b'), Or('c', 'd'))
  101. assert t.expand() == \
  102. Or(And('a', 'c'), And('a', 'd'), And('b', 'c'), And('b', 'd'))
  103. def test_logic_fromstring():
  104. S = Logic.fromstring
  105. assert S('a') == 'a'
  106. assert S('!a') == Not('a')
  107. assert S('a & b') == And('a', 'b')
  108. assert S('a | b') == Or('a', 'b')
  109. assert S('a | b & c') == And(Or('a', 'b'), 'c')
  110. assert S('a & b | c') == Or(And('a', 'b'), 'c')
  111. assert S('a & b & c') == And('a', 'b', 'c')
  112. assert S('a | b | c') == Or('a', 'b', 'c')
  113. raises(ValueError, lambda: S('| a'))
  114. raises(ValueError, lambda: S('& a'))
  115. raises(ValueError, lambda: S('a | | b'))
  116. raises(ValueError, lambda: S('a | & b'))
  117. raises(ValueError, lambda: S('a & & b'))
  118. raises(ValueError, lambda: S('a |'))
  119. raises(ValueError, lambda: S('a|b'))
  120. raises(ValueError, lambda: S('!'))
  121. raises(ValueError, lambda: S('! a'))
  122. raises(ValueError, lambda: S('!(a + 1)'))
  123. raises(ValueError, lambda: S(''))
  124. def test_logic_not():
  125. assert Not('a') != '!a'
  126. assert Not('!a') != 'a'
  127. assert Not(True) == False
  128. assert Not(False) == True
  129. # NOTE: we may want to change default Not behaviour and put this
  130. # functionality into some method.
  131. assert Not(And('a', 'b')) == Or(Not('a'), Not('b'))
  132. assert Not(Or('a', 'b')) == And(Not('a'), Not('b'))
  133. raises(ValueError, lambda: Not(1))
  134. def test_formatting():
  135. S = Logic.fromstring
  136. raises(ValueError, lambda: S('a&b'))
  137. raises(ValueError, lambda: S('a|b'))
  138. raises(ValueError, lambda: S('! a'))
  139. def test_fuzzy_xor():
  140. assert fuzzy_xor((None,)) is None
  141. assert fuzzy_xor((None, True)) is None
  142. assert fuzzy_xor((None, False)) is None
  143. assert fuzzy_xor((True, False)) is True
  144. assert fuzzy_xor((True, True)) is False
  145. assert fuzzy_xor((True, True, False)) is False
  146. assert fuzzy_xor((True, True, False, True)) is True
  147. def test_fuzzy_nand():
  148. for args in [(1, 0), (1, 1), (0, 0)]:
  149. assert fuzzy_nand(args) == fuzzy_not(fuzzy_and(args))