【educoder】数理逻辑(用z3证明等值演算式)

第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")

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值