【自然语言处理】形式语言和自动机

实验名称

形式语言和自动机

  • 实验目的

熟悉形式语言和自动机,设计程序实现有限自动机,学习对字符串进行合法性检测,使用有限自动机判断字符串是否是可以被接受的。书写出能够成功运行的代码。

  • 实验内容:

状态集为{ q0, q1, q2, q3 },输入符号集为{ 0,1 },初始状态为q0,终止状态为q0,在如下的状态转移函数中输入字符串,判断该字符串的合法性以及能否被接受。

输入:三行,每行一个字符串,询问能否被接受。

输出:三行,对于每一个输入,判断字符串合法性并由有限自动机判断是否可以被接受。

  • 实验过程:
  1. 先想办法怎样保存状态图,这里用二维数组来进行保存。

将状态图转化为二维数组,二维数组的第一维保存的是每个状态,也就是q0到q3,分别用0-3表示;第二维保存的是符号集,也就是转移的指标0、1;而数组的值表示的是转移后的状态。将所给的状态图转化为二维数组表示如下:

      

  1. 判断字符串中的字符是否在输入符号集中,也就是判断字符串中是否仅包含0和1;先将字符串中每个数字保存在数组求q[ ]中,之后通过flag进行标记,如果遇到非0或1,则flag标记为1,之后通过flag进行判断。

  

  1. 最关键的判断字符串是否可以被有限自动机接收。

通过check()函数实现。依据之前创建的二维数组状态表,进行字符串中每个符号到相应状态的转化。通过a1和a2分别得到状态数组的一维和二维,由上述数组创建可知第一维保存的是每个状态,也就是q0到q3,分别用0-3表示;第二维保存的是符号集,也就是转移的指标0、1;整体通过for循环实现状态的转化。最终的状态通过a1的值得到。若最终返回状态q0,则a1最终的值为0。

判断check()函数判断完成后进行输出

  • 结果展示:
  • 心得体会:

通过此次形式语言和自动机的实验,我更加深刻的认识了有限自动机,掌握了有限自动机转换过程,熟悉了状态转移的具体过程以及代码实现方法,通过思考和状态转移的演示,想到了二维数组来存储状态图,编写代码过程中也逐渐发现二维数组可以实现。

参考代码:
 


#include <iostream>
using namespace std;
int a[4][2];
int sum=0;
int q[100];
int check(){
    int a1=0,a2;
    for(int i=0;i<sum;i++)
    {
        a2=q[i];
        a1=a[a1][a2];
    }
    if(a1==0)
        return 1;
    else
        return 0;
}
int main(int argc, const char * argv[]) {
    // insert code here...
    int flag=0;
    int i=0,j=0;
    int ch;
    a[0][0]=2;
    a[0][1]=1;
    a[1][0]=3;
    a[1][1]=0;
    a[2][0]=0;
    a[2][1]=3;
    a[3][0]=1;
    a[3][1]=2;
    while(i<3){
        cin>>ch;
        int ch2=ch;
        while(ch){
            ch/=10;
            sum++;
        }
        for(j=sum-1;j>=0;j--)
        {
            q[j]=ch2%10;
        }
        for(int i=0;i<sum;i++)
        {
            if(q[i]!=0&&q[i]!=1)
            {
                flag=1;
            }
        }
        if(flag==1)
            cout<<"字符串中的字符不再输入符号集中\n";
        else{
            if(check())
                cout<<"字符串可以被有限自动机接收\n";
            else
                cout<<"字符串不可以被有限自动机接收\n";
        }
        flag=0;
        i++;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值