lo tolmencre - 1 year ago 68
Python Question

# True + True = 2. Elegantly perform boolean arithmetic?

I have nested lists of truth values representing SAT forumlas, like this:

``````[[[0, True, False], [0, True, False], [0, True, 1]], [[0, True, True], [2, True, True], [3, False, True]], [[1, False, False], [1, False, False], [3, False, True]]]
``````

representing

``````([x0=0] + [x0=0] + [x0=1]) * ([x0=1] + [x1=1] + [-x2=1]) * ([-x3=0] + [-x3=0] + [-x2=1])
``````

I would like to calculate the truth value of the whole formula. First step would be adding up the truth values of the literals in each clause.

like this:

``````clause_truth_value = None

for literal in clause:
# multiply polarity of literal with its value
# sum over all literals
clause_truth_value += literal[1]*literal[2]
``````

if
`clause_truth_value`
is
`True`
after the summation, the clause is true as a whole.

But I am not getting what I expected:

`True + True = 2`
that's not as expected

`True * True = 1`
that's as expected

`False + False = 0`
that's as expected

`False * False = 0`
that's as expected

so... True is simply 1 and False is 0... that sucks, I expected the arithmetic operators to be overloaded for the boolean algebra. Is there an elegant way to do do boolean arithmetic with boolean variables?

In Python, `True == 1` and `False == 0`, as `True` and `False` are type `bool`, which is a subtype of `int`. When you use the operator `+`, it is implicitly adding the integer values of `True` and `False`.

``````int(True)
# 1

int(False)
# 0
``````

What you really want is to treat `True` and `False` as binary numbers.

``````int(False & False)
# 0

int(True & False)
# 0

int(True & True)
# 1
``````

x & y

Does a "bitwise and". Each bit of the output is 1 if the corresponding bit of x AND of y is 1, otherwise it's 0.

x | y

Does a "bitwise or". Each bit of the output is 0 if the corresponding bit of x AND of y is 0, otherwise it's 1.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download