Building truth tables

Aaron "Castironpi" Brady castironpi at gmail.com
Fri Sep 26 20:01:44 CEST 2008


On Sep 26, 11:40 am, "Tim Rowe" <digi... at gmail.com> wrote:
> 2008/9/26 andrea <kerny... at gmail.com>:
>
> > Well I would like to make a little program that given a certain
> > logical expression gives the complete truth table.
>
> > It's not too difficult in fact, I just have some doubts on how to
> > design it.
>
> > I thought something like that:
>
> > class Term:
>
> > class Table:
>
> >   def and(...
> >   def or(...
>
> As a quick and dirty solution, I'd write a function that takes a
> function as a parameter.
>
> Starting with a helper function to separate the bits of an integer
> into a list of bools:
>
> def int_to_bool(i, bits):
>         # Extract the bits of i to a boolean array.
>         # 'bits' is the number of signifcant bits.
>         result = []
>         for j in range(0, bits):
>                 result.append(i & 1)
>                 i >>= 1
>         result.reverse()
>         return result
>
> Now I'd define a function such as:
> def table(f, n):
>         # Calculate a truth table for function f taking n boolean parameters
>         result = []
>         for i in range(0, math.pow(2, n)):
>                 for j in range(0, n):
>                         params = int_to_bool(i, n)
>                 result.append(params + [(f(*params))])
>         return result
>
> Now you could define the function you want as a separate function, or
> just use a lambda:
>
> table(lambda a, b, c:(a or b) and c, 3)
> [[0, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 1, 1, 1], [1, 0, 0, 0],
> [1, 0, 1, 1], [1, 1, 0, 0], [1, 1, 1, 1]]
>
> Each element in the result is the state of the parameters followed by
> the result of the function.
>
> I stress that this is quick and dirty -- I'm sure somebody will be
> along with something better soon!
>
> --
> Tim Rowe

Good idea.  If you want prefixed operators: 'and( a, b )' instead of
'a and b', you'll have to write your own.  ('operator.and_' is bitwise
only.)  It may be confusing to mix prefix with infix: 'impl( a and b,
c )', so you may want to keep everything prefix, but you can still use
table( f, n ) like Tim said.



More information about the Python-list mailing list