你没有听错,用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("括号使用错误,不是合式公式")
我也是小白,程序哪里可能有些不足之处,请多多指教,如果你有更好的解题方法或思路,可以联系我,大家可以一起学习,一起进步的!?