第1关:用z3证明等值演算式
from z3 import *
def equivalent_exp(p, q, r):
############begin############
# 双重否定律,定律赋值给f1,例:f1 = p == Not(Not(p))
f1 = p == Not(Not(p))
# 幂等律,定律赋值给f21、f22
f21 = p == Or(p, p)
f22 = p == And(p, p)
# 交换律,定律赋值给f31、f32
f31 = And(p, q) == And(q, p)
f32 = Or(p, q) == Or(q, p)
# 结合律,定律赋值给f41、f42
f41 = And((And(p, q)), r) == And((p, And(q, r)))
f42 = Or((Or(p, q)), r) == Or((p, Or(q, r)))
# 分配律,定律赋值给f51、f52
f51 = Or(p, And(q, r)) == And(Or(p, q), Or(p, r))
f52 = And(p, Or(q, r)) == Or(And(p, q), And(p, r))
# 德摩根律,定律赋值给f61、f62
f61 = Not(And(p, q)) == Or(Not(p), Not(q))
f62 = Not(Or(p, q)) == And(Not(p), Not(q))
# 吸收律,定律赋值给f71、f72
f71 = Or(p, And(p, q)) == p
f72 = And(p, Or(p, q)) == p
# 零律,定律赋值给f81、f82
f81 = Or(q, True) == True
f82 = And(q, False) == False
# 同一律,定律赋值给f91、f92
f91 = Or(q, False) == q
f92 = And(q, True) == q
# 排中律,定律赋值给f10
f10 = Or(q, Not(q)) == True
# 矛盾律,定律赋值给f11
f11 = And(q, Not(q)) == False
# 蕴涵等值式,定律赋值给f12
f12 = Implies(p, q) == Or(Not(p), q)
# 等价等值式,定律赋值给f13
f13 = (p == q) == And(Implies(p, q), Implies(q, p))
# 假言易位,定律赋值给f14
f14 = Implies(p, q) == Implies(Not(q), Not(p))
# 等价否定等值式,定律赋值给f15
f15 = (p == q) == (Not(p) == Not(q))
# 归谬论,定律赋值给f16
f16 = And(Implies(p, q), Implies(p, Not(q))) == Not(p)
#############end#############
return f1, f21, f22, f31, f32, f41, f42, f51, f52, f61, f62, f71, f72, f81, f82, f91, f92, f10, f11, f12, f13, f14, f15, f16
# 使用Solver证明等值式
def prove(f):
s = Solver()
############begin############
# 在()中填入正确的代码
s.add(f)
#############end#############
if s.check() == sat:
print("proved")
else:
print("failed to prove")