ε-CLOSURE(I)构造算法的程序实现 免费 编译原理 课程设计 合工大 python

课设前几题都是比较简单的,不需要怎么动脑。

这里贴一份python代码,需要注意的是默认设定以下几种情况:
1.每个状态转换集只有一个目标,也就是转换矩阵中不允许出现多个字符。
2.状态必须以数字为标号,且按顺序从0开始一直往下
以上情况是为了减少代码工作量而做的设置,但文章末尾会把解决方法给大家
那么接下来就是激动人心的贴代码时刻拉

def selection1(target):
    "这里是选择1的引导函数"
    closure=FindClosure(target);
    print('%d 的z闭包为:%s  \n' % (target, closure));
    return ;

def selection2() :
    "选择2的引导函数,用i遍历所有状态,并找出相应的z闭包"
    for i in raw_df.index :
        closure=FindClosure(i)
        print('%d 的z闭包为:%s  \n' %(i,closure));
    return ;

def FindClosure(target):
    "关键的寻找闭包函数"
    closure=[];  #用于存放寻找到的状态集
    closure.append(target);  #z闭包包括自身和经过任意条z弧能到达的状态
    while (pd.isnull(raw_df.loc[target,'z'])==False) :
        #当target 经过z弧之后有后继结点(即target有向外的z弧),则进行循环
        target=raw_df.loc[target, 'z'];#把经过z弧之后的后继节点当作新的target,继续向下寻找
        closure.append(target);#把这个新节点加入到z闭包中

    return closure;

#主函数
if __name__ == '__main__':
    print('Hello,world!');
import pandas as pd;
raw_df=pd.read_excel('datafile.xlsx');#导入表格数据
print(raw_df);#打印
sign=input('请选择要执行的功能,输入编号后按回车,1.寻找目标字符的z闭包。\n2.自动寻找所有字符的z闭包\n');
if sign == '1':#选择功能
    target=int(input('请输入要找的目标字符:\n'));#注意接受的是个字符,需要转换成int
    selection1(target);
if sign == '2':
    selection2();

这里给出开头两种情况的解决方案:
1.若转换矩阵包含多个字符,则需要在获取该格数据之后用split等函数进行分割,之后将这些分割好的字符全部加入到一个容器里面,可以用列表,字典等。然后依次从容器中取出一个字符进行闭包运算。直到容器为空,代表计算完毕,则停止。

2.用pandas的set_index()函数,设置新的索引值,新的索引值可以是各个状态,这样就可以实现abcd等索引方式,之后在代码内部修改loc相关函数即可


这个是数据表格,用Exel软件建立即可

输入输出结果:

   状态    z    a    b
0   0  4.0  NaN  NaN
1   1  NaN  3.0  NaN
2   2  5.0  NaN  NaN
3   3  NaN  2.0  NaN
4   4  1.0  4.0  4.0
5   5  6.0  5.0  5.0
6   6  NaN  NaN  NaN
请选择要执行的功能,输入编号后按回车,1.寻找目标字符的z闭包。
2.自动寻找所有字符的z闭包
2
0 的z闭包为:[0, 4.0, 1.0]  

1 的z闭包为:[1]  

2 的z闭包为:[2, 5.0, 6.0]  

3 的z闭包为:[3]  

4 的z闭包为:[4, 1.0]  

5 的z闭包为:[5, 6.0]  

6 的z闭包为:[6]  


Process finished with exit code 0

最后,可以做的更加精细,以下是加分项:

1.闭包可视化——结果自动生成图像并保存
2.根据状态矩阵自动生成nfa图像——也是可视化

The End

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,让我们来了解一下ε-closure(I)的概念:ε-closure(I)是指从状态集合I开始,通过零个或多个ε转换可以到达的所有状态的集合。在有限状态自动机(Finite State Machine)中,ε-closure(I)非常有用,可以帮助我们确定一个状态集合的闭包。 现在,让我们来介绍一下如何使用我们开发的ε-closure(I)程序。 1. 下载程序: 你可以从我们的GitHub仓库,下载ε-closure(I)程序的源代码,或者下载已编译好的可执行文件。 2. 运行程序: 打开命令行终端,进入程序所在的文件夹,运行以下命令: ``` ./epsilon_closure ``` 3. 输入状态集合: 程序会提示你输入状态集合,以空格分隔每个状态,例如: ``` Enter the states: q0 q1 q2 ``` 4. 输入ε转换: 程序会提示你输入ε转换,以逗号分隔每个转换,例如: ``` Enter the epsilon transitions: q0,q1 q1,q2 q2,q0 ``` 5. 输入操作: 现在,你可以选择执行以下操作: - 输入状态集合,计算ε-closure(I) - 输入单个状态,计算ε-closure(S) - 退出程序 6. 运行操作: 输入操作序号,按回车即可执行对应操作。例如: ``` Choose an operation: 1 - Compute epsilon closure of a state set 2 - Compute epsilon closure of a single state 3 - Exit Enter your choice: 1 Enter the state set: q0 q1 ``` 程序会输出ε-closure(I)的结果。 以上就是ε-closure(I)程序的使用说明。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值