題目
(1)準備3個以上測試DFA文件。(提示:其中一定要有沒有最小化的DFA)
(2)用C或C++語言編寫用等價劃分法最小化DFA的程序。
(3)經測試無誤。測試不易。可求出兩個DFA的語言集合的某個子集(如長度小於某個N),再證實兩個語言集合完全相同!
關鍵代碼
void spolit(int x,int &flag0,int &flag,vector<Table> D,string F){
char ss;
for(int m=0;m<flag0;m++)
{
for(int i=0;i<part[m].length();i++)
{
ss=change(part[m][i],F[x],D);
for(int j=0;j<flag;j++)
{
if(belong(ss,part[j])){
part0[j]=part0[j]+part[m][i];
}
if(ss=='&')
{
part0[flag]=part0[flag]+part[m][i];
break;
}
}
}
for(int j=0;j<=flag;j++)
{
if(part0[j]!=""&&part0[j]!=part[m])
{
part[flag++]=part0[j];
part0[j]="";
part[m]="";
}
else part0[j]="";
}
}
flag0=flag;
}
//分割子集法進行DFA的最小化
int hopcraft(vector<Table> D,string F)
{
int flag=2,flag0;
int x=F.length();
flag0=flag;
while(x--)
{
spolit(x,flag0,flag,D,F);
}
return flag;
}
輸入輸出結果