编译原理,确定有穷自动机DFA最小化

输入DFA五元组,将其最小化。

实验算法:

1,  对于DFA的字母表M,把M划分成终态集和非终态集,令P=M

2,  对于P中的一个集合I,寻找I每一个元素K,找到K从边a对应的节点,加入集合I1,若I1P中某个集合的子集,跳至步骤3,若不是,步骤4.

3,  寻找P中下一个集合,执行步骤2,若所有集合均是子集,则步骤5.

4,  I1划分成P中某几个集合子集的形式,将I1划分后的集合加入P,并删除I。执行步骤3

5,  用P中的每一集合的第一个元素代替集合,形成新的DFA。

代码实现:

 

1、  依次按照定义,输入五元组G={MESfB},其中M是字母表,E是终态集,S是初态,f是函数,B是边集。

2、  对于字母表M,用最小化算法进行递归,直至结束。

3、  输出五元组。

编程环境:windows 86-64bite,python 3.5

 

源代码:

m=list(input('请输入字母表'))
z=list(input('请输入终态集合'))
b=list(input('请输入边集'))
s=input('请输入初态')
print('请输入f,以0结束')
dfa=[]
while True:
    i=list(input())
    if i==['0']:
        break;
    dfa.append(i)
m1=[]
for i in m:
    m1=m1+[i]
z1=[]
for i in z:
    z1=z1+[i]
n=2
m=set(m)
z=set(z)
m=m.difference(z)
m=list(m)
z=list(z)
p=[]
m=sorted(m)
z=sorted(z)
p.append(m)
p.append(z)
work=[]
while True:
    over=0
    for ppp in range(5):
        for kk in range(0,n):
            c=b[kk]
            for i in p:
            
                for  zb in i:
                    for j in range(14):
                        if zb==dfa[j][0]:
                            if c==dfa[j][1]:
                                work=work+[dfa[j][2]];
                l=len(p)
                
                gg=set()
                g=[];
                for j in range(len(work)):
                    for pii in range(l):
                        if {work[j]}.issubset(set(p[pii])):
                            work[j]=pii
                su=0
                
              
                for l in range(len(work)-1):
                    if work[l]==work[l+1]:
                        su=su+1
                if su==len(work)-1:
                    work=[]
                    continue
                if len(work)==1:
                    work=[]
                    continue
                else:

                    x1=[]
                    l1=len(i)
                    x1=x1+[i[0]]
                    mengyan=0
                    i.pop(0)
                    conter=1
                    for ii in range(1,l1):
                        if work[0]==work[ii]:
                            x1=x1+[i[ii-conter]]
                            i.pop(ii-conter)
                            conter=conter+1
                            mengyan=mengyan+1
                    p.append(x1);
                    work=[]
                    over=1
    if over==0:
        break;
for i in p:
    if len(i)>1:
        for j in dfa:
            for k in i:
                if k==j[0]: 
                    j[0]=i[0]
print(dfa)
dfa1=[]
for i in dfa:
    if i not in dfa1:
        dfa1.append(i)
print('最终集合划分为: ',p)
for i in p:
    if len(i)>1:
        while len(i)!=1:
            i.pop();    
print('字母表为:           ',m1)
z2=[]
for i in p:
    if i[0] in z1:
        z2=z2+[i[0]]
print('终态集合为:        ',z2)
print('初态为:               ',s)
print('边集:                  ',b)
print('f:                          ',dfa1)


样例测试:

输出最小化后的字母表和划分的集合:

要实现最小化DFA(Deterministic Finite Automaton)的算法,可以使用python编程语言。下面是一个基本的实现方案: 首先,定义一个DFA类,该类包含以下函数: 1. read_input(self, input_string):根据给定的输入字符串,遍历DFA的状态转换,返回最终状态。 2. minimize(self):最小化DFA的主要函数。首先,根据不可达状态和等价状态的定义,标记出所有不可达状态以及等价状态。然后,合并等价状态并更新状态转换关系。最后,更新DFA的初始状态和接受状态。 3. merge_states(self, state1, state2):将两个状态合并为一个等价状态,并更新状态转换关系。 4. remove_unreachable_states(self):删除所有不可达状态及其相关的状态转换关系。 现在,根据上述基本实现方案,可以进行如下的实现: 1. 创建一个DFA类,并初始化初始状态、接受状态、状态转换表等实例变量。 2. 实现read_input函数,根据输入字符串遍历状态转换表,并返回最终状态。 3. 实现merge_states函数,根据给定的两个状态合并为一个等价状态,并更新状态转换表。 4. 实现remove_unreachable_states函数,遍历状态转换表,删除所有不可达状态及其相关的状态转换关系。 5. 实现minimize函数,调用remove_unreachable_states函数删除不可达状态,并使用逐对比较法合并等价状态,直到无法继续合并为止。 最后,可以通过创建一个DFA对象,调用minimize函数来实现最小化DFA的操作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值