This module is well-documented with docstrings and type hints. Use help(matlog.tokens) or your editor hints to get familiar with it.
Basic usage:
from matlog import parse
expr = parse("A & B")
print(expr.solve(A=1, B=0)) # False
print(expr.solve(B=0)) # False
print(expr.table()) # prints the truth table of expressionSimply use pip install matlog or clone repo and launch setup.py
An expression string is a bunch of tokens (atoms, expressions, operators and literals) in a specific order.
There's a big example of expression string:
a | (b -> c) == (~a ^ 1) <- ~z
Let's review in detail:
Any letter is considered as an atom. Atoms can be only one letter long and must be divided by operators.
A literal is 1 or 0 (True and False respectively). Literals are treated like atoms.
Any expression can contain nested expression strings in brackets. Nested expressions are treated like atoms.
matlog expression syntax supports 6 binary operators and one unary (listed in order of priority, from high to low):
- ~ (not / negation) unary: turns True to False and vice versa.
- & (and / conjunction): True if (and only if) both operands are True
- | (or / disjunction): True if (and only if) any operand is True.
- -> (implication): False if (and only if) the left operand is True but the right is False
- == (equality / biconditional): True if (and only if) operands are equal to each other
- ^ (xor / exclusive disjunction): False if (and only if) operands are equal to each other
- <- (converse implication): -> with reversed operands order
Expression class is the main class of the module. There are three ways to create an Expression object:
- from an expression string:
matlog.parse(expr_str) - copying an existing Expression:
expr.copy()(same asmatlog.Expression(expr.tokens)) - deep-copying an existing Expression object:
expr.deep_copy() - constructing an Expression from tokens (module won't check if it is valid in this case):
matlog.Expression([token1, token2...])
You can use expr.table(keep=None) method to build a truth table for an Expression object.
keep parameter can be either 1 or 0 (to filter rows with corresponding values) or None if you need a full table
If you need a value for a specific set of values, you can use .solve() method like this:
from matlog import parse
expr = parse("A & B | C")
print(expr.solve(A=1, B=0, C=1)) # prints 1
print(expr.solve({"A": 1, "B": 0, "C": 1})) # you can pass a dictionary tooif you need a result value (release version would provide more convenient ways, of course):
expr.value(A=1, B=0, C=1) # 1 (raises an exception if there's not enough data to solve expression)If you know some (but not all) values, you can also use .solve(), providing some values:
from matlog import parse
expr = parse("A & B | C")
print(expr.solve(B=0)) # prints C
print(expr.solve({"B": 0})) # prints C tooSmart (smarter than watermelon!) algorithm, simplifies expressions better than bare .solve().
This method recursively simplifies complex expressions, so expect it to work slower than (again) bare .solve().
from matlog import parse
expr = parse("(A | B | C) & ~(A | ~B | C)")
print(expr.simplify()) # prints ~(A | ~B | C)If you're wondering if expressions are equal (producing the same results with any set of values), you can use Expression.equals(self, other) method:
from matlog import parse
expr1 = parse("A & B")
expr2 = parse("B & A")
print(expr1.equals(expr2)) # True