计算机理论导引实验ADFA的可判定性Word文档格式.docx
- 文档编号:17622773
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:21
- 大小:224.01KB
计算机理论导引实验ADFA的可判定性Word文档格式.docx
《计算机理论导引实验ADFA的可判定性Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机理论导引实验ADFA的可判定性Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
intstart_Q;
//起始状态
intnum_E;
//字母表的个数
int**next_Q;
//转移函数
boolGo(int*w);
//接受输入时的运行结果
DFA();
//构造函数
~DFA();
//析构函数
};
DFA:
:
DFA()
intnum_acc;
//接受状态的总个数
cout<
<
"
状态总个数:
;
cin>
>
num_Q;
字母表总个数:
num_E;
起始状态编号(从0开始):
start_Q;
接受状态的总个数:
num_acc;
//给接受状态数组动态分配空间
acc_Q=newint[num_acc+1];
接受状态编号(以空格隔开):
for(inti=0;
i<
i++)
{
cin>
acc_Q[i];
}
//标记结尾
acc_Q[num_acc]=-1;
//转移函数数组分配空间
next_Q=newint*[num_Q];
for(i=0;
next_Q[i]=newint[num_E];
转移函数:
endl;
for(intj=0;
j<
j++)
for(intk=0;
k<
k++)
{
cout<
编号为"
的状态接受到编号为"
的输入时,转移到状态:
cin>
next_Q[j][k];
}
}
//析构函数
~DFA()
if(acc_Q)
deleteacc_Q;
if(next_Q)
deletenext_Q;
//在输入w下运行自动机
boolDFA:
Go(int*w)
boolresult;
//运行结果
int*p=w;
//动态之争
intnow_Q;
//当前状态
now_Q=start_Q;
//在输入下依次寻找下一个状态
while(*p!
=-1)
cout<
当前状态"
now_Q<
在输入"
*p<
下,转移到:
now_Q=next_Q[now_Q][*p];
p++;
p=acc_Q;
result=false;
//判断运行完成之后当前状态是否在接受状态中
if(*p==now_Q)
result=true;
returnresult;
intmain()
DFAB;
int*w;
intlen_w;
boolgoon=true;
while(goon)
endl<
-----------开始验证-----------"
输入字符串长度为:
len_w;
w=newint[len_w+1];
输入串中字母的编号依次分别为(以空格隔开):
for(inti=0;
w[i];
w[len_w]=-1;
正在运行中..."
boolresult=B.Go(w);
运行结果为:
if(result)
接受"
else
拒绝"
验证其它字符串?
(Y/N)"
charc;
c;
if(c=='
N'
)
return0;
deletew;
}改程序在VC++下可以通过编译,并且运行结果正确
四、测试数据以及运行结果
以教材上面的一个自动机为例。
该自动机识别含有001作为字串的所有字符串,而拒绝其它的串。
运行结果如下所示:
CFG是P成员
四、测试数据以及运行结果10
上下文无关文法CFGG是否派生某个串W。
采用动态规划(DynamicProgramming)设计一个多项式时间的验证算法
G,w>
,可以在多项式时间内判定ACFG。
//第一类规则,即规则右边只含有两个变元
classRegular_1
intleft;
intright_1;
intright_2;
//第二类规则,即规则右边只含有一个终结符或者空
classRegular_2
intright;
//表格类,用来存放中间数据
classTable
intsize;
//表格的行和列的数量,与输入长度相同
intnum_v;
//表格中每个单元格最多含有的数量大小,与cfg的变元数量相同
int***value;
//用来存放数据的三元数组
Table(intnum_v,intnum_w);
//构造函数,参数指定输入字符串的长度以及cfg变元的数量
~Table();
//析构函数
voidSetValue(inti,intj,intnum);
//向表格第i行j列追加数据num
boolCheckValue(inti,intj,intnum);
//检查表格第i行j列是否含有数据num,含有则返回true,否则返回false
voidPrint();
//打印表格的内容
Table:
~Table()
if(value)
deletevalue;
voidTable:
SetValue(inti,intj,intnum)
int*p=value[i][j];
//寻找追加数据的位置
while((*p)!
*p=num;
boolTable:
CheckValue(inti,intj,intnum)
if((*p)==num)
returntrue;
returnfalse;
Table(intnum_v,intnum_w)
size=num_w;
this->
num_v=num_v;
value=newint**[num_w];
//给value动态分配,并将初值设为-1
num_w;
value[i]=newint*[num_w];
for(intj=0;
value[i][j]=newint[num_v];
for(intk=0;
num_v;
{
value[i][j][k]=-1;
}
Print()
inti,j,k;
---------------打印表格内容------------------"
if(size==0)
表格为空"
return;
表格内容如下:
size;
for(j=0;
table["
]["
]:
for(k=0;
if(this->
value[i][j][k]==-1)
break;
else
cout<
this->
value[i][j][k]<
"
classCFG
intnum_e;
Regular_1*r1;
Regular_2*r2;
intstart_v;
CFG();
~CFG();
CFG:
CFG()
------------CFG构造函数----------"
intnum_r1,num_r2;
----------------------"
变元总数:
终结符总数:
num_e;
第一类规则总数(规则右边为变元):
num_r1;
r1=newRegular_1[num_r1+1];
在下面的输入中注意:
变元编号以及终结符编号从0开始"
第"
条规则的三个变元的编号依次为(以空格隔开):
r1[i].left>
r1[i].right_1>
r1[i].right_2;
r1[i].left=-1;
第二类规则总数(规则右边为终结符或空):
num_r2;
r2=newRegular_2[num_r2+1];
条规则的变元的编号和终结符编号(空以-1表示)依次为(以空格隔开):
r2[i].left>
r2[i].right;
r2[i].left=-1;
起始变元的编号为:
start_v;
~CFG()
if(r1)
deleter1;
if(r2)
deleter2;
boolCFG:
boolresult=false;
Regular_1*p1=r1;
Regular_2*p2=r2;
intlen_w=0;
//获取输入长度
len_w++;
p=w;
Tablet(num_v,len_w);
inti,j,k,l;
-----------开始运行-----------"
if(w[0]==-1)
-------------------------------"
检查发现输入为空..."
while((*p2).left!
{
if((*p2).left==start_v&
&
(*p2).right==-1)
cout<
检查到起始变元到空的规则..."
运行完毕!
结果为:
接受!
result=true;
returnresult;
p2++;
未发现从起始变元到空的派生。
运行完毕,结果为:
returnfalse;
p2=r2;
i=0;
开始从头到尾扫描,将某些变元放入对应的对角线上的表格中:
if((*p2).right==*p)
由于变元"
(*p2).left<
派生"
终结符"
故将其放入表格的"
行"
列"
t.SetValue(i,i,(*p2).left);
p2=r2;
i++;
开始依次向表格的某些单元格添加数据..."
for(l=2;
l<
=len_w;
l++)
for(i=0;
len_w-l+1;
j=i+l-1;
for(k=i;
=j-1;
while((*p1).left!
{
if(t.CheckValue(i,k,(*p1).right_1)&
t.CheckValue(k+1,j,(*p1).right_2))
{
cout<
table("
"
)中含有变元"
(*p1).right_1<
而且table("
k+1<
)中含有"
(*p1).right_2;
因此将变元"
(*p1).left<
放入table("
)中"
t.SetValue(i,j,(*p1).left);
}
p1++;
}
p1=r1;
t.Print();
if(t.CheckValue(1,len_w-1,start_v))
起始变元"
start_v<
在talbe(0,"
len_w-1<
returntrue;
else{
在不在talbe(0,"
拒绝!
main()
------------CFG是P成员判定程序----------"
CFGc;
while(true)
int*w;
intlen_w;
输入w的长度:
if(len_w==0)
else
依次输入w的内容的编号(以空格隔开):
w[i]=-1;
c.Go(w);
return;
改程序在VC++下可以通过编译,并且运行结果正确
以教材习题上面的一个CFG为例。
该CFG描述如下:
S->
RT
R->
TR|a
T->
TR|b
在该CFG下面测试输入w1=baba和w2=ababb测试结果如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 理论 导引 实验 ADFA 可判定性