bool_algebra.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include "simple/geom/bool_algebra_extra.hpp"
  2. using simple::geom::vector;
  3. vector OO(false,false);
  4. vector OI(false,true);
  5. vector IO(true,false);
  6. vector II(true,true);
  7. auto c_OO = to_conjunction(OO); auto d_OO = to_disjunction(OO);
  8. auto c_OI = to_conjunction(OI); auto d_OI = to_disjunction(OI);
  9. auto c_IO = to_conjunction(IO); auto d_IO = to_disjunction(IO);
  10. auto c_II = to_conjunction(II); auto d_II = to_disjunction(II);
  11. void UntruthTable()
  12. {
  13. assert( ! c_OO ); assert( ! d_OO );
  14. assert( ! c_OI ); assert( d_OI );
  15. assert( ! c_IO ); assert( d_IO );
  16. assert( c_II ); assert( d_II );
  17. }
  18. void DeMorgan()
  19. {
  20. assert( ~c_OO == d_II ); assert( ~d_OO == c_II );
  21. assert( ~c_OI == d_IO ); assert( ~d_OI == c_IO );
  22. assert( ~c_IO == d_OI ); assert( ~d_IO == c_OI );
  23. assert( ~c_II == d_OO ); assert( ~d_II == c_OO );
  24. }
  25. void ReducingOperators()
  26. {
  27. assert( (d_OO || d_OO) == false); assert( (c_OO || c_OO) == false);
  28. assert( (d_OO || d_OI) == true ); assert( (c_OO || c_OI) == false);
  29. assert( (d_OO || d_IO) == true ); assert( (c_OO || c_IO) == false);
  30. assert( (d_OO || d_II) == true ); assert( (c_OO || c_II) == true );
  31. assert( (d_OI || d_OI) == true ); assert( (c_OI || c_OI) == false);
  32. assert( (d_OI || d_IO) == true ); assert( (c_OI || c_IO) == false);
  33. assert( (d_OI || d_II) == true ); assert( (c_OI || c_II) == true );
  34. assert( (d_IO || d_IO) == true ); assert( (c_IO || c_IO) == false);
  35. assert( (d_IO || d_II) == true ); assert( (c_IO || c_II) == true );
  36. assert( (d_II || d_II) == true ); assert( (c_II || c_II) == true );
  37. assert( (d_OO && d_OO) == false); assert( (c_OO && c_OO) == false);
  38. assert( (d_OO && d_OI) == false); assert( (c_OO && c_OI) == false);
  39. assert( (d_OO && d_IO) == false); assert( (c_OO && c_IO) == false);
  40. assert( (d_OO && d_II) == false); assert( (c_OO && c_II) == false);
  41. assert( (d_OI && d_OI) == true ); assert( (c_OI && c_OI) == false);
  42. assert( (d_OI && d_IO) == true ); assert( (c_OI && c_IO) == false);
  43. assert( (d_OI && d_II) == true ); assert( (c_OI && c_II) == false);
  44. assert( (d_IO && d_IO) == true ); assert( (c_IO && c_IO) == false);
  45. assert( (d_IO && d_II) == true ); assert( (c_IO && c_II) == false);
  46. assert( (d_II && d_II) == true ); assert( (c_II && c_II) == true );
  47. }
  48. void ElementwiseOperators()
  49. {
  50. assert( (d_OO | d_OO) == OO); assert( (c_OO | c_OO) == OO);
  51. assert( (d_OO | d_OI) == OI); assert( (c_OO | c_OI) == OI);
  52. assert( (d_OO | d_IO) == IO); assert( (c_OO | c_IO) == IO);
  53. assert( (d_OO | d_II) == II); assert( (c_OO | c_II) == II);
  54. assert( (d_OI | d_OI) == OI); assert( (c_OI | c_OI) == OI);
  55. assert( (d_OI | d_IO) == II); assert( (c_OI | c_IO) == II);
  56. assert( (d_OI | d_II) == II); assert( (c_OI | c_II) == II);
  57. assert( (d_IO | d_IO) == IO); assert( (c_IO | c_IO) == IO);
  58. assert( (d_IO | d_II) == II); assert( (c_IO | c_II) == II);
  59. assert( (d_II | d_II) == II); assert( (c_II | c_II) == II);
  60. assert( (d_OO & d_OO) == OO); assert( (c_OO & c_OO) == OO);
  61. assert( (d_OO & d_OI) == OO); assert( (c_OO & c_OI) == OO);
  62. assert( (d_OO & d_IO) == OO); assert( (c_OO & c_IO) == OO);
  63. assert( (d_OO & d_II) == OO); assert( (c_OO & c_II) == OO);
  64. assert( (d_OI & d_OI) == OI); assert( (c_OI & c_OI) == OI);
  65. assert( (d_OI & d_IO) == OO); assert( (c_OI & c_IO) == OO);
  66. assert( (d_OI & d_II) == OI); assert( (c_OI & c_II) == OI);
  67. assert( (d_IO & d_IO) == IO); assert( (c_IO & c_IO) == IO);
  68. assert( (d_IO & d_II) == IO); assert( (c_IO & c_II) == IO);
  69. assert( (d_II & d_II) == II); assert( (c_II & c_II) == II);
  70. }
  71. auto OO_OO = vector(OO,OO); auto OI_OO = vector(OI,OO);
  72. auto OO_OI = vector(OO,OI); auto OI_OI = vector(OI,OI);
  73. auto OO_IO = vector(OO,IO); auto OI_IO = vector(OI,IO);
  74. auto OO_II = vector(OO,II); auto OI_II = vector(OI,II);
  75. auto IO_OO = vector(IO,OO); auto II_OO = vector(II,OO);
  76. auto IO_OI = vector(IO,OI); auto II_OI = vector(II,OI);
  77. auto IO_IO = vector(IO,IO); auto II_IO = vector(II,IO);
  78. auto IO_II = vector(IO,II); auto II_II = vector(II,II);
  79. void ExpandingOperators()
  80. {
  81. assert( (d_OO * d_OO) == to_disjunction(OO_OO) );
  82. assert( (d_OO * d_OI) == to_disjunction(OO_OO) );
  83. assert( (d_OO * d_IO) == to_disjunction(OO_OO) );
  84. assert( (d_OO * d_II) == to_disjunction(OO_OO) );
  85. assert( (d_OI * d_OO) == to_disjunction(OO_OO) );
  86. assert( (d_OI * d_OI) == to_disjunction(OO_OI) );
  87. assert( (d_OI * d_IO) == to_disjunction(OI_OO) );
  88. assert( (d_OI * d_II) == to_disjunction(OI_OI) );
  89. assert( (d_IO * d_OO) == to_disjunction(OO_OO) );
  90. assert( (d_IO * d_OI) == to_disjunction(OO_IO) );
  91. assert( (d_IO * d_IO) == to_disjunction(IO_OO) );
  92. assert( (d_IO * d_II) == to_disjunction(IO_IO) );
  93. assert( (d_II * d_OO) == to_disjunction(OO_OO) );
  94. assert( (d_II * d_OI) == to_disjunction(OO_II) );
  95. assert( (d_II * d_IO) == to_disjunction(II_OO) );
  96. assert( (d_II * d_II) == to_disjunction(II_II) );
  97. assert( (c_OO + c_OO) == to_conjunction(OO_OO) );
  98. assert( (c_OO + c_OI) == to_conjunction(OO_II) );
  99. assert( (c_OO + c_IO) == to_conjunction(II_OO) );
  100. assert( (c_OO + c_II) == to_conjunction(II_II) );
  101. assert( (c_OI + c_OO) == to_conjunction(OI_OI) );
  102. assert( (c_OI + c_OI) == to_conjunction(OI_II) );
  103. assert( (c_OI + c_IO) == to_conjunction(II_OI) );
  104. assert( (c_OI + c_II) == to_conjunction(II_II) );
  105. assert( (c_IO + c_OO) == to_conjunction(IO_IO) );
  106. assert( (c_IO + c_OI) == to_conjunction(IO_II) );
  107. assert( (c_IO + c_IO) == to_conjunction(II_IO) );
  108. assert( (c_IO + c_II) == to_conjunction(II_II) );
  109. assert( (c_II + c_OO) == to_conjunction(II_II) );
  110. assert( (c_II + c_OI) == to_conjunction(II_II) );
  111. assert( (c_II + c_IO) == to_conjunction(II_II) );
  112. assert( (c_II + c_II) == to_conjunction(II_II) );
  113. }
  114. int main()
  115. {
  116. UntruthTable();
  117. DeMorgan();
  118. ReducingOperators();
  119. ElementwiseOperators();
  120. ExpandingOperators();
  121. return 0;
  122. }