filled out the remaining operators

This commit is contained in:
Alex Thannhauser 2025-06-06 11:52:35 -05:00
parent dd13983e84
commit e3b0af2f12

66
main.py
View file

@ -409,40 +409,52 @@ def evaluate(expr):
return ~evaluate(subexp) & M;
case (first, "||", *rest):
result = evaluate(first);
for subexpr in rest[::2]:
subresult = evaluate(subexpr);
result = result | subresult;
for subexpr in rest[::2]: result = result | evaluate(subexpr);
return result;
case (first, "!|", *rest):
result = evaluate(first);
for subexpr in rest[::2]: result = ~(result | evaluate(subexpr)) & M;
return result;
case (first, "|!", *rest):
result = evaluate(first);
for subexpr in rest[::2]: result = (~result | evaluate(subexpr)) & M;
return result;
# case (left, "!|", right):
# return ~(evaluate(left) | evaluate(right)) & M;
# case (left, "|!", right):
# return (~evaluate(left) | evaluate(right)) & M;
case (first, "&&", *rest):
result = evaluate(first);
for subexpr in rest[::2]:
subresult = evaluate(subexpr);
result = result & subresult;
for subexpr in rest[::2]: result = result & evaluate(subexpr);
return result;
case (first, "!&", *rest):
result = evaluate(first);
for subexpr in rest[::2]: result = ~(result & evaluate(subexpr)) & M;
return result;
case (first, "&!", *rest):
result = evaluate(first);
for subexpr in rest[::2]: result = (~result & evaluate(subexpr)) & M;
return result;
case (first, "<", *rest):
result = evaluate(first);
for subexpr in rest[::2]: result = (~result & evaluate(subexpr)) & M;
return result;
case (first, "<=", *rest):
result = evaluate(first);
for subexpr in rest[::2]: result = (~result | evaluate(subexpr)) & M;
return result;
case (first, ">", *rest):
result = evaluate(first);
for subexpr in rest[::2]: result = (result & ~evaluate(subexpr)) & M;
return result;
case (first, ">=", *rest):
result = evaluate(first);
for subexpr in rest[::2]: result = (result | ~evaluate(subexpr)) & M;
return result;
case (first, "!=", *rest):
result = evaluate(first);
for subexpr in rest[::2]: result = (result ^ evaluate(subexpr)) & M
return result;
# case (left, "!&", right):
# return ~(evaluate(left) & evaluate(right)) & M;
# case (left, "&!", right):
# return (~evaluate(left) & evaluate(right)) & M;
# case (left, "<", right):
# return (~evaluate(left) & evaluate(right)) & M;
# case (left, "<=", right):
# return (~evaluate(left) | evaluate(right)) & M;
# case (left, ">", right):
# return (evaluate(left) & ~evaluate(right)) & M;
# case (left, ">=", right):
# return (evaluate(left) | ~evaluate(right)) & M;
case (first, "==", *rest):
result = evaluate(first);
for subexpr in rest[::2]:
subresult = evaluate(subexpr);
result = ~(result ^ subresult) & M
for subexpr in rest[::2]: result = ~(result ^ evaluate(subexpr)) & M
return result;
# case (left, "!=", right):
# return evaluate(left) ^ evaluate(right);
case _:
print(expr);
assert(not "TODO");