True + True = 2. Elegantly perform boolean arithmetic?
Asked Answered
P

2

10

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?

Photogram answered 8/7, 2016 at 23:43 Comment(4)
Boolean operators are | and &, not + and *Ridings
But there is no += like and=. So....Photogram
Instead of using x += y, you can use x = x or yBuschi
@lotolmencre There's always the bitwise versions; x &= y and x |= y. Those aren't lazy, though.Dysphemia
L
13

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


From Bitwise Operators in Python:

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.

Lolalolande answered 8/7, 2016 at 23:49 Comment(1)
Note that lists are unsupported operand types for & & |, but and and or will work.Adalai
B
5

There is a way to do boolean arithmetic. That way is to use boolean operators.

  • and, as you call "*", is and.
  • or, as you call "+", is or.
Buschi answered 8/7, 2016 at 23:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.