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

上传人:b****3 文档编号:27523615 上传时间:2023-07-02 格式:DOCX 页数:10 大小:16.58KB
下载 相关 举报
不确定有限状态自动机的确定化.docx_第1页
第1页 / 共10页
不确定有限状态自动机的确定化.docx_第2页
第2页 / 共10页
不确定有限状态自动机的确定化.docx_第3页
第3页 / 共10页
不确定有限状态自动机的确定化.docx_第4页
第4页 / 共10页
不确定有限状态自动机的确定化.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

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

《不确定有限状态自动机的确定化.docx》由会员分享,可在线阅读,更多相关《不确定有限状态自动机的确定化.docx(10页珍藏版)》请在冰豆网上搜索。

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

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

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

2008-12-0522:

11

#include

#include

#defineMAXS100

usingnamespacestd;

stringNODE;//结点集合

stringCHANGE;//终结符集合

intN;   //NFA边数

structedge{

stringfirst;

stringchange;

stringlast;

};

structchan{

stringltab;

stringjihe[MAXS];

};

voidkong(inta)

{

inti;

for(i=0;i

  cout<<'';

}

//排序

voidpaixu(string&a)

{

inti,j;

charb;

for(j=0;j

  for(i=0;i

   if(NODE.find(a[i])>NODE.find(a[i+1]))

   {

    b=a[i];

    a[i]=a[i+1];

    a[i+1]=b;

   }

}

voideclouse(charc,string&he,edgeb[])

{

intk;

for(k=0;k

{

  if(c==b[k].first[0])

   if(b[k].change=="*")

   {

    if(he.find(b[k].last)>he.length())

     he+=b[k].last;

    eclouse(b[k].last[0],he,b);

   }

}

}

voidmove(chan&he,intm,edgeb[])

{

inti,j,k,l;

k=he.ltab.length();

l=he.jihe[m].length();

for(i=0;i

  for(j=0;j

   if((CHANGE[m]==b[j].change[0])&&(he.ltab[i]==b[j].first[0]))

    if(he.jihe[m].find(b[j].last[0])>he.jihe[m].length())

     he.jihe[m]+=b[j].last[0];

for(i=0;i

  for(j=0;j

   if((CHANGE[m]==b[j].change[0])&&(he.jihe[m][i]==b[j].first[0]))

    if(he.jihe[m].find(b[j].last[0])>he.jihe[m].length())

     he.jihe[m]+=b[j].last[0];

}

//输出

voidoutputfa(intlen,inth,chan*t)

{

inti,j,m;

cout<<"I      ";

for(i=0;i

  cout<<'I'<

cout<

for(i=0;i

{

  cout<<''<

  m=t[i].ltab.length();

  for(j=0;j

  {

   kong(8-m);

   m=t[i].jihe[j].length();

   cout<

  }

  cout<

}

}

voidmain()

{

edge*b=newedge[MAXS];

inti,j,k,m,n,h,x,y,len;

boolflag;

stringjh[MAXS],endnode,ednode,sta;

cout<<"请输入NFA各边信息(起点条件[空为*]终点),以#终止:

"<

for(i=0;i

{

  cin>>b[i].first;

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

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

}

N=i;

/*for(j=0;j

  cout<

for(i=0;i

{

  if(NODE.find(b[i].first)>NODE.length())

   NODE+=b[i].first;

  if(NODE.find(b[i].last)>NODE.length())

   NODE+=b[i].last;

  if((CHANGE.find(b[i].change)>CHANGE.length())&&(b[i].change!

="*"))

   CHANGE+=b[i].change;

}

len=CHANGE.length();

cout<<"结点中属于终态的是:

"<

cin>>endnode;

for(i=0;i

  if(NODE.find(endnode[i])>NODE.length())

  {

   cout<<"所输终态不在集合中,错误!

"<

   return;

  }

//cout<<"endnode="<

chan*t=newchan[MAXS];

t[0].ltab=b[0].first;

h=1;

eclouse(b[0].first[0],t[0].ltab,b);      //求e-clouse

//cout<

for(i=0;i

{

  for(j=0;j

   for(m=0;m

    eclouse(t[i].ltab[j],t[i].jihe[m],b);  //求e-clouse

  for(k=0;k

  {

   //cout<";

   move(t[i],k,b);         //求move(I,a)

   //cout<

   for(j=0;j

    eclouse(t[i].jihe[k][j],t[i].jihe[k],b);//求e-clouse

  }

  for(j=0;j

  {

   paixu(t[i].jihe[j]);  //对集合排序以便比较

   for(k=0;k

   {

    flag=operator==(t[k].ltab,t[i].jihe[j]);

    if(flag)

     break;

   }

   if(!

flag&&t[i].jihe[j].length())

    t[h++].ltab=t[i].jihe[j];

  }

}

cout<

"<

outputfa(len,h,t);  //输出状态转换矩阵

//状态重新命名

string*d=newstring[h];

NODE.erase();

cout<

"<

for(i=0;i

{

  sta=t[i].ltab;

  t[i].ltab.erase();  

  t[i].ltab='A'+i;

  NODE+=t[i].ltab;

  cout<<'{'<

  for(j=0;j

   if(sta.find(endnode[j])

    d[1]=ednode+=t[i].ltab;

  for(k=0;k

   for(m=0;m

    if(sta==t[k].jihe[m])

     t[k].jihe[m]=t[i].ltab;

}

for(i=0;i

  if(ednode.find(NODE[i])>ednode.length())

   d[0]+=NODE[i];

endnode=ednode;

cout<

"<

outputfa(len,h,t);   //输出DFA

cout<<"其中终态为:

"<

//DFA最小化

m=2;

sta.erase();

flag=0;

for(i=0;i

{

  //cout<<"d["<

  for(k=0;k

  {

   //cout<<"I"<

   y=m;

   for(j=0;j

   {

    for(n=0;n

    {

     if(d[n].find(t[NODE.find(d[i][j])].jihe[k])

     {

      if(t[NODE.find(d[i][j])].jihe[k].length()==0)

       x=m;

      else

       x=n;

      if(!

sta.length())

      {

       sta+=x+48;

      }

      else

       if(sta[0]!

=x+48)

       {

        d[m]+=d[i][j];

        flag=1;

        d[i].erase(j,1);

        //cout<

        j--;

       }

      break;//跳出n

     }

    }//n

   }//j

   if(flag)

   {

    m++;

    flag=0;

   }

   //cout<<"sta="<

   sta.erase();

  }//k

}//i

cout<

";

for(i=0;i

  cout<<"{"<

cout<

//状态重新命名

chan*md=newchan[m];

NODE.erase();

cout<

"<

for(i=0;i

{

  md[i].ltab='A'+i;

  NODE+=md[i].ltab;

  cout<<"{"<

}

for(i=0;i

  for(k=0;k

   for(j=0;j

   {

    if(d[i][0]==t[j].ltab[0])

    {

     for(n=0;n

     {

      if(!

t[j].jihe[k].length())

       break;

      else

       if(d[n].find(t[j].jihe[k])

       {

        md[i].jihe[k]=md[n].ltab;

        break;

       }

     }

    break;

    }

   }

ednode.erase();

for(i=0;i

  for(j=0;j

   if(d[i].find(endnode[j])

    ednode+=md[i].ltab;

endnode=ednode;

cout<

"<

outputfa(len,m,md);

cout<<"其中终态为:

"<

}

/////////////////////////////////

测试数据:

i*1

1a1

1b1

1*2

2a3

2b4

3a5

4b5

5*6

6a6

6b6

6*f

#

f

////////////////////////////////

运行结果:

请输入NFA各边信息(起点条件[空为*]终点),以#终止:

i*1

1a1

1b1

1*2

2a3

2b4

3a5

4b5

5*6

6a6

6b6

6*f

#

结点中属于终态的是:

f

状态转换矩阵如下:

I      Ia     Ib

-------------------------

i12    123    124

123    12356f124

124    123    12456f

12356f12356f1246f

12456f1236f  12456f

1246f  1236f  12456f

1236f  12356f1246f

重命名:

{i12}=A

{123}=B

{124}=C

{12356f}=D

{12456f}=E

{1246f}=F

{1236f}=G

DFA如下:

I      Ia     Ib

-------------------------

A      B      C

B      D      C

C      B      E

D      D      F

E      G      E

F      G      E

G      D      F

其中终态为:

DEFG

集合划分:

{A}{DEFG}{B}{C}

重命名:

{A}=A

{DEFG}=B

{B}=C

{C}=D

最小化DFA如下:

I      Ia     Ib

-------------------------

A      C      D

B      B      B

C      B      D

D      C      B

其中终态为:

B

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1