Propositional Equivalence


In [45]:
from itertools import product, chain

In [34]:
def implies(p, q):
    return 0 if p == 1 and q == 0 else 1

def and_(p, q):
    return 1 if p == 1 and q == 1 else 0

def or_(p, q):
    return 1 if p == 1 or q == 1 else 0

def not_(p):
    return 1 if p == 0 else 0

def generate_product():
    return product(*[[0, 1]] * 3)

def check_propositional_equivalence(f_right, f_left, product):
    return all((f_right(*vals) == f_left(*vals) for vals in product))

In [49]:
check_propositional_equivalence(
    lambda p, q, r: implies(p, and_(q, r)),
    lambda p, q, r: implies(and_(p, q), r),
    generate_product()
)


Out[49]:
False

In [50]:
check_propositional_equivalence(
    lambda p, q, r: implies(p, implies(q, r)),
    lambda p, q, r: implies(and_(p, q), r),
    generate_product()
)


Out[50]:
True

In [51]:
check_propositional_equivalence(
    lambda p, q, r: implies(and_(p, q), r),
    lambda p, q, r: implies(and_(p, r), q),
    generate_product()
)


Out[51]:
False

In [52]:
check_propositional_equivalence(
    lambda p, q, r: and_(implies(p, or_(q, r)), implies(p, r)),
    lambda p, q, r: implies(q, r),
    generate_product()
)


Out[52]:
False

In [53]:
check_propositional_equivalence(lambda p, q, r: and_(implies(p, or_(q, r)), implies(p, r)),
                                lambda p, q, r: implies(q, r),
                                generate_product()
                               )


Out[53]:
False

In [54]:
check_propositional_equivalence(
    lambda p, q, r: or_(implies(p, q), implies(q, r)),
    lambda p, q, r: or_(p, not_(p)),
    generate_product()
)


Out[54]:
True