一、介绍OT表
图1 OT表简介
闭包性:形象的理解就是辅助行区域T(S∪I)在T(S)中,否则就在S域中添加 SUI中不包含在原S域中对应的行标签及其所有前缀
一致性:就是指如果S域中二个行标签如果对应的值相同,则其加入同一个基本字a作为后缀,其值也要相同,否则为了区别这两个状态,需要在E中添加这a∪e。
二、学习过程
由于学习过程的前提是有一个被测系统(黑箱),所以需要首先构建,并且确认输入输出。
已知:被测系统SUI,输入表
输入基本字:{a,b}
(1)初始化OT表
表1 三四行辅助行区域,三四行的行标签a,b为输入基本字的集合。第二行为状态行区域
O 1 O_1 O1 | a | b |
---|---|---|
ε | A | B |
a | A | B |
b | A | B |
检查一致性与闭包性,符合S域的每一个行标签对应为一个状态,然后直接看对应的E区域的列标签(即基本字)所得到的值(即该基本字所对应的输出)。
图5 当前学习下的状态图
(2)完善OT表
构造好之后,询问teacher,teacher返回不对和一个反例。字串bba,SUL输出是C,而你输出是A,这个时候,算法就将 bba这个字串及其所有前缀添加进OT表的S域
表2 将bba字串及其所有前缀添加进OT表的状态区域
O 2 O_2 O2 | a | b |
---|---|---|
ε | A | B |
b | A | B |
bb | C | B |
bba | A | B |
a | A | B |
b | A | B |
当然同时要需要更新辅助域,规则就是S∪I(S是状态行区域,I是基本字集合)即可然后重新经过成员查询得到OT表的值,如下图所示:
删除辅助域中的最后一行,计算{ε, b, bb, bba} 与 {a, b}的并集
表3 更新后的OT表
O 2 O_2 O2 | a | b |
---|---|---|
ε | A | B |
b | A | B |
bb | C | B |
bba | A | B |
a | A | B |
ba | A | B |
bbaa | A | B |
bbb | C | B |
bbab | C | B |
T(S∪I)都包含于T(S),所以是闭包的,但是检查一致性的时候发现,在S域T(ε)和T(b)都一样是AB,可是其加上同一个后缀b,这个时候T(b)和T(bb)不同,一个是A B,一个是C B,所以不满足一致性,则需要在E中添加b∪e即ba
O 3 O_3 O3 | a | b | ba |
---|---|---|---|
ε | A | B | A |
b | A | B | C |
bb | C | B | C |
bba | A | B | C |
a | A | B | A |
ba | A | B | A |
bbaa | A | B | A |
bbb | C | B | C |
bbab | C | B | C |
最后构造状态图
总结
整个流程需要代码模拟,但现有代码不能运行,只能看着代码结合论文构造,而且学习过程中需要向被测系统发送输入,接收输出,没有实际系统的话只能模拟它会返回什么。
整个算法的流程大体如上