你没有听错,用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,希望大佬们多多指教

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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("括号使用错误,不是合式公式")

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