不确定有限状态自动机的确定化

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

不确定有限状态自动机的确定化

【实验目的】

输入:非确定有限(穷)状态自动机。

输出:确定化的有限(穷)状态自动机。

【实验原理】

同一个字符串α可以由多条通路产生,而在实际应用中,作为描述控制过程的自动机,通常都是确定有限自动机DFA,因此这就需要将不确定有限自动机转换成等价的确定有限自动机,这个过程称为不确定有限自动机的确定化,即NFA确定化为DFA。

NFA确定化的实质是以原有状态集上的子集作为DFA上的一个状态,将原状态间的转换为该子集间的转换,从而把不确定有限自动机确定化。经过确定化后,状态数可能增加,而且可能出现一些等价状态,这时就需要简化。

【程序代码】

#include

#include

#include

using namespace std;

#define max 100

struct edge{

string first;//边的初始结点

string change;//边的条件

string last;//边的终点

};

int N;//NFA的边数

vector value;

string closure(string a,edge *b)

{

int i,j;

for(i=0;i

{

for(j=0;j

{

if(b[j].first[0]==a[i]&&b[j].change=="&")

{

a=a+b[j].last[0];

}

}

}

return a;

}

string move(string jihe,char ch,edge *b)

{

int i,j;

string s="";

for(i=0;i

{

for(j=0;j

{

if(b[j].first[0]==jihe[i]&&b[j].change[0]==ch)

s=s+b[j].last;

}

}

return s;

}

string sort(string t)

{

int k,i,j;

char tt;

for(i=0;i

{

k=i;

for(j=i+1;j

{

if(t[j]

}

tt=t[k];t[k]=t[i];t[i]=tt;

}

return t;

}

void main()

{

int i,j,x=0,h,length,m,d=0;

string Change;

string First,Last;//初态,终态,

string T[max],ss;

edge *b=new edge[max];

cout<<"请输入各边信息:起点条件(空用&表示)终点,以输入#结束。"<

for(i=0;i

{

cin>>b[i].first;

if(b[i].first=="#")break;

else

cin>>b[i].change>>b[i].last;

}

N=i;

cout<<"请输入该NFA的初态及终态:"<

cin>>First>>Last;

cout<<"请输入此NFA状态中的输入符号即边上的条件:"<>Change;

T[x]=closure(First,b);

T[x]=sort(T[x]);

value.push_back(0);

i=0;

while(value[i]==0&&value.size())

{

value[i]=1;

for(j=0;j

{

ss="";

ss=move(T[i],Change[j],b);

length=value.size();

{

if(T[h]==sort(closure(ss,b)))break;

}

if(h==length)

{

T[++x]=sort(closure(ss,b));

value.push_back(0);

}

}

i++;

}

edge *DFA=new edge[max];

for(i=0;i<=x;i++)//构造DFA的各边

{

for(j=0;j

{

DFA[d].first=T[i];

DFA[d].change=Change[j];

ss="";

ss=sort(closure(move(T[i],Change[j],b),b));

if(ss==T[m])DFA[d++].last=T[m];

}

}

cout<<"此NFA构造的DFA的各边信息如下:"<

for(i=0;i

{

for(m=0;m<=x;m++)

{

if(DFA[i].first==T[m])cout<

}

for(m=0;m<=x;m++)

if(DFA[i].last==T[m])cout<<" "<

}

cout<<"该DFA的初态为:";

for(m=0;m<=x;m++)

{

for(j=0;j

{

ss=T[m];

if(ss[j]==First[0])cout<

相关文档
最新文档