专栏首页Flaneur的文章分享Python判断离散数学的合式公式

Python判断离散数学的合式公式

前言

        你没有听错,用python程序来解决离散数学的逻辑推理问题,我当我第一次听老师说的时候也很吃惊(再说上学期的Python学的也不咋地…..?),但经老师讲解后才知道,使用python解题不仅效率高,而且准确性也很强的,所以还是有必要学习以下的。

判断是否为合式公式

        第一个题目就是判断一个公式是否为合式公式,这也是最基础的,因为只有当在输入的合式公式正确的情况下,才能进一步的运算解题,所以先讲解一下怎么判断合式公式。         首先要知道什么是合式公式? (1)原子命题常项或变项是合式公式; (2)如果A是合式公式,则(-A)也是合式公式(- 表示非); (3)如果A,B是合式公式,则(AB)、(A+B)、(A < B)、( A ~ B)也是合式公式;(此处 合取 + 析取 < 代表条件 ~ 代表双条件) (4)只有有限次地应用(1)~(3)所包含的命题变元,联结词和括号的符号串才是合式公式。 个人思路: 输入字符串,扫描字符串,把所含的各关联词分区出来,在判断每个关联词使用是否正确 比如不合规则的情况: (1) 关联词所处位置不对 (2) 关联词的连续使用 (3) 括号不匹配 (4) …….. 程序中可能会有bug,希望大佬们多多指教

这道题应该有很多好的方法,但我不太会用,我这里只能暴力判断了。

废话不多说,直接上代码?

import re
print("定义‘!’为否定联结词")
print("定义‘&’为合取联结词")
print("定义‘-’为析取联结词")
print("定义‘>’为蕴含联结词")
print("定义‘~’为等价联结词")
print("如果公式错误,会指出哪里错误;如果公式正确,则什么也不输出")
S =input("请输入需要判断的公式:")
T = list(S)
if S[0] in ['&','-',')','~','>'] :
    print("不是合式公式")
a ,b,c,d,f ="!" , "&" ,"-" , ">" , "~"
if a in T:
        Q = [m.start() for m in re.finditer(a, S)]
        for i in Q :
            if S[-1] == '!' :
                print ("‘!’联结词使用错误,不是合式公式")
                break
            if S[i+1] in ['&','!','-',')','~','>']:
                print("‘!’联结词使用错误,不是合式公式")
                break
            if S[i-1] in ['!']:
                print("‘!’联结词使用错误,不是合式公式!")
                break
if b in T:
        W = [m.start() for m in re.finditer(b, S)]
        for y in W :
            if S[-1] == '&' :
                print ("‘&’联结词使用错误,不是合式公式")
                break
            if S[y+1] in ['-',')','~','>','&'] :
                print("‘&’联结词使用错误,不是合式公式")
                break
            if S[y-1] in ['-','(','~','>','&'] :
                print("‘&’联结词使用错误,不是合式公式")
                break
if c in T:
        E = [m.start() for m in re.finditer(c, S)]
        for h in E :
            if S[-1] == '-' :
                print("‘-’联结词使用错误,不是合式公式")
                break
            if S[h+1] in (')','>','~','-') :
                print("‘-’联结词使用错误,不是合式公式")
                break
            if S[h-1] in ('&','-','>','~') :
                print("‘-’联结词使用错误,不是合式公式")
                break
if d in T:
        R = [m.start() for m in re.finditer(d, S)]
        for k in R :
            if S[-1] == '>' :
                print ("‘>’联结词使用错误,不是合式公式")
                break
            if S[k+1] in [')','>'] :
                print("‘>’联结词使用错误,不是合式公式")
                break
            if S[k-1] in  ['(','>'] :
                print("‘>’联结词使用错误,不是合式公式")
                break
if f in T:
        O = [m.start() for m in re.finditer(f, S)]
        for v in O :
            if S[-1] == '~' :
                print("‘~’联结词使用错误,不是合式公式")
                break
            if S[v+1] in [')','~'] :
                print("‘~’联结词使用错误,不是合式公式")
                break
            if S[v-1] in ['(','~'] :
                print("‘~’联结词使用错误,不是合式公式")
                break
if '(' or ')' in S :
        e = 0
        klb =[]
        for i in S :
            if i == '(':
                klb.append(i)
            if i == ')':
                if len(klb)==0:
                    e=1
                    break
                else :
                    klb.pop()
        if len(klb)!=0 :
            e = 1
        if e==1:
            print("括号使用错误,不是合式公式")

        我也是小白,程序哪里可能有些不足之处,请多多指教,如果你有更好的解题方法或思路,可以联系我,大家可以一起学习,一起进步的!?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浅谈机器学习-分类和聚类的区别

            机器学习中有两类的大问题,一个是分类,一个是聚类。在我们的生活中,我们常常没有过多的去区分这两个概念,觉得聚类就是分类,分类也差不多就是聚类,下...

    Flaneur
  • Python爬虫--爬取豆瓣 TOP250 电影排行榜

    本篇讲介绍一个简单的Python爬虫案例–爬取豆瓣 TOP250 电影排行榜。 很多朋友在看一部电影前都喜欢先找一下网友们对该片的评价。

    Flaneur
  • 梯度下降法的三种形式BGD、SGD、MBGD及python实现

            梯度下降法作为机器学习中较常使用的优化算法,其有着三种不同的形式:批量梯度下降(Batch Gradient Descent)、随机梯度下降(S...

    Flaneur
  • FPGA基础知识极简教程(2)抛却软件思维去设计硬件电路

    学过一门或多门软件语言的数字设计初学者经常会犯一些错误 ,例如硬件语言的并发性,可综合以及不可综合语句区分,循环语句的使用等等。本文的建议将带你区别并扫除这些易...

    Reborn Lee
  • 给文档加了个小程序的功能

    接手文档项目后,想看看用户对文档有什么反馈,除了一部分错误的反馈外,还收到一部分有价值、但是不「善良」的反馈。

    villainhr
  • javascript计算几天前,几小时前,几分钟前,几秒前

    本来没什么事,但看到有人用一大堆的 if-else 控制语句就有点火了,也不想想:用一个变量一次次除以虽然不同但有规律的数字,也不嫌累,纯粹一码农,没有任何脑子...

    挨踢小子部落阁
  • 应用SAAS结构技术的开源药店管理系统-源代码结构说明

    一、药店系统内容说明 在前些时间,我们发布了一个基于AgileEAS.NET平台的SAAS结构的案例-AgileEAS.NET平台开发实例-药店系统-快速的SA...

    魏琼东
  • openresty+lua+kafka方案与Tomcat接口并发度对比分析

      之前的项目基于nginx反向代理后转发到Tomcat的API接口进行业务处理,然后将json数据打入kafka中,但是随着业务的扩大,访问量越来越大,并发数...

    小勇DW3
  • Mendel errors对家系分型数据进行过滤

    Mendek errors 称为孟德尔误差,在遗传学上,当一个个体的allel不可能从双亲获得时,可以称这个allel为孟德尔误差。

    生信修炼手册
  • LiteOS内核教程04 | 信号量(任务同步)

    在多任务操作系统中,不同的任务之间需要同步运行,信号量功能可以为用户提供这方面的支持。信号量(Semaphore)是一种实现任务间通信的机制,实现任务之...

    Mculover666

扫码关注云+社区

领取腾讯云代金券