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]:
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]:
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]:
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]:
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]:
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]: