Expr.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #!/usr/bin/python
  2. # vim: set fileencoding=utf8
  3. # Created:20080216
  4. # By Jeff Connelly
  5. #
  6. # Trinary expression evaluator
  7. from Symbols import *
  8. from Trits import Trits
  9. DEBUG = False
  10. unary_functions = {
  11. # Everyone agrees on
  12. u"/": Trits("10i"),
  13. # Mouftah-based
  14. u"∇": Trits("1ii"), u"└": Trits("1ii"),
  15. u"∆": Trits("11i"), u"┘": Trits("11i"),
  16. u"¬": Trits("001"),
  17. u"⌐": Trits("i00"),
  18. # Grubb-based
  19. u"↘": Trits("ii0"),
  20. u"↗": Trits("011"),
  21. u"∩": Trits("01i"),
  22. u"∪": Trits("10i"),
  23. # Ternary-logic-minimization-literature-based
  24. u"♨": Trits("01i")
  25. }
  26. def evaluate_unary(function, inputs):
  27. """Given a unary function number in a Trits object, f, pass
  28. all the trits in the inputs object through the function."""
  29. assert isinstance(function, Trits), \
  30. "Need to pass a Trits object as function"
  31. assert isinstance(inputs, Trits), \
  32. "You must pass a Trits object in inputs"
  33. outputs = []
  34. for t in inputs:
  35. outputs.append({
  36. False: function[0],
  37. None: function[1],
  38. True: function[2]
  39. }[t])
  40. return Trits(outputs)
  41. class Expr(object):
  42. def __init__(self, s):
  43. assert len(s) > 0, "Empty string can't evaluate"
  44. variable = s[-1]
  45. assert variable.isalpha(), "Only accept expressions of form xxxxA, where x=unary operators, A=variable"
  46. if DEBUG: print "Variable:", variable
  47. # Evaluate gates from right-to-left
  48. unary_gates = reversed(s[:-1])
  49. # Start with identity function
  50. total_unary = Trits("i01")
  51. # Evaluate with unary function on the identity
  52. for gate in unary_gates:
  53. if DEBUG: print "Gate:", gate.encode('utf8')
  54. total_unary = evaluate_unary(unary_functions[gate], total_unary)
  55. # Now total_unary is the function# of all the unary gates
  56. self.total_unary = total_unary
  57. def evaluate(self, inputs):
  58. return evaluate_unary(self.total_unary, inputs)
  59. if __name__ == "__main__":
  60. s = u"⌐∇a"
  61. print "Expression:", s.encode('utf8')
  62. e = Expr(s)
  63. print "Total unary function is:", e.total_unary
  64. print
  65. ins = Trits("iiiiiiiii00000001111111")
  66. print "Passing in trit vector as 'a':"
  67. print "a:\t", ins
  68. print s.encode('utf8') + ":\t", e.evaluate(ins)