离散数学大作业

1.作业要求

2.题目选择

命题公式的真值表

用户输入一个命题公式,输出该公式对应的真值表。

例如:输入(p ∨ q) → ¬r,输出:

题目描述

关于为什么选择了这个题目,最后会提到 。

3.所需解决的关键问题

4.代码

使用Python完成

注释已经给出。

import itertools
from tabulate import tabulate  # 导入 tabulate 用于美化表格格式

# 处理蕴含操作的函数
def handle_implications(expression):
    # 在蕴含符号 '→' 上分割表达式
    parts = expression.split('→')
    # 用正确的逻辑重新组合表达式,将 "A → B" 转换为 "not A or B"
    new_expression = ' or '.join(['(not (' + part.strip() + '))' if i < len(parts) - 1 else part.strip() for i, part in enumerate(parts)])
    return new_expression

# 生成真值表的函数
def generate_truth_table(expression):
    # 从表达式中识别独特的变量
    variables = set(filter(str.isalpha, expression))
    variables = sorted(variables)  # 排序以确保一致的顺序

    # 将逻辑符号替换为 Python 的等价符号
    expression = expression.replace('∧', ' and ').replace('∨', ' or ').replace('¬', ' not ')
    
    # 使用处理蕴含操作的函数
    expression = handle_implications(expression)

    # 为变量生成所有可能的真值组合
    truth_values = list(itertools.product([False, True], repeat=len(variables)))

    # 对于每种组合,计算并存储结果
    truth_table = []
    for values in truth_values:
        # 创建一个字典,将变量名映射到其真值
        env = dict(zip(variables, values))

        # 在这个环境中计算表达式的结果
        result = eval(expression, {}, env)
        truth_table.append((values, result))

    return variables, truth_table

# 主程序入
  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值