https://github.com/welchbj/tt
a Pythonic toolkit for working with Boolean expressions
https://github.com/welchbj/tt
boolean boolean-algebra boolean-expression python sat sat-solver satisfiability transformations truth-table
Last synced: about 2 months ago
JSON representation
a Pythonic toolkit for working with Boolean expressions
- Host: GitHub
- URL: https://github.com/welchbj/tt
- Owner: welchbj
- License: mit
- Created: 2015-12-22T06:49:35.000Z (almost 10 years ago)
- Default Branch: develop
- Last Pushed: 2025-05-08T02:27:02.000Z (6 months ago)
- Last Synced: 2025-07-19T22:39:06.539Z (4 months ago)
- Topics: boolean, boolean-algebra, boolean-expression, python, sat, sat-solver, satisfiability, transformations, truth-table
- Language: Python
- Homepage: https://tt.brianwel.ch
- Size: 682 KB
- Stars: 219
- Watchers: 7
- Forks: 12
- Open Issues: 4
-
Metadata Files:
- Readme: README.rst
- License: LICENSE.txt
Awesome Lists containing this project
README
Synopsis
--------
tt (**t**\ ruth **t**\ able) is a library aiming to provide a toolkit for working with Boolean expressions and truth tables. Please see the `project site`_ for guides and documentation.
Installation
------------
tt is tested on the latest three major versions of CPython. You can get the latest release from PyPI with::
pip install ttable
Features
--------
Parse expressions::
>>> from tt import BooleanExpression
>>> b = BooleanExpression('A impl not (B nand C)')
>>> b.tokens
['A', 'impl', 'not', '(', 'B', 'nand', 'C', ')']
>>> print(b.tree)
impl
`----A
`----not
`----nand
`----B
`----C
Evaluate expressions::
>>> b = BooleanExpression('(A /\\ B) -> (C \\/ D)')
>>> b.evaluate(A=1, B=1, C=0, D=0)
False
>>> b.evaluate(A=1, B=1, C=1, D=0)
True
Interact with expression structure::
>>> b = BooleanExpression('(A and ~B and C) or (~C and D) or E')
>>> b.is_dnf
True
>>> for clause in b.iter_dnf_clauses():
... print(clause)
...
A and ~B and C
~C and D
E
Apply expression transformations::
>>> from tt import to_primitives, to_cnf
>>> to_primitives('A xor B')
>>> to_cnf('(A nand B) impl (C or D)')
Or create your own::
>>> from tt import tt_compose, apply_de_morgans, coalesce_negations, twice
>>> b = BooleanExpression('not (not (A or B))')
>>> f = tt_compose(apply_de_morgans, twice)
>>> f(b)
>>> g = tt_compose(f, coalesce_negations)
>>> g(b)
Exhaust SAT solutions::
>>> b = BooleanExpression('~(A or B) xor C')
>>> for sat_solution in b.sat_all():
... print(sat_solution)
...
A=0, B=0, C=0
A=1, B=0, C=1
A=0, B=1, C=1
A=1, B=1, C=1
Find just a few::
>>> with b.constrain(A=1):
... for sat_solution in b.sat_all():
... print(sat_solution)
...
A=1, B=0, C=1
A=1, B=1, C=1
Or just one::
>>> b.sat_one()
Build truth tables::
>>> from tt import TruthTable
>>> t = TruthTable('A iff B')
>>> print(t)
+---+---+---+
| A | B | |
+---+---+---+
| 0 | 0 | 1 |
+---+---+---+
| 0 | 1 | 0 |
+---+---+---+
| 1 | 0 | 0 |
+---+---+---+
| 1 | 1 | 1 |
+---+---+---+
And `much more`_!
License
-------
tt uses the `MIT License`_.
.. _MIT License: https://opensource.org/licenses/MIT
.. _project site: https://tt.brianwel.ch
.. _bool.tools: http://www.bool.tools
.. _much more: https://tt.brianwel.ch/en/latest/user_guide.html