自从我开始尝试找到这个问题的解决方案已经过去了一周,我最后读到了关于CYK算法的内容,但我无法理解它对我的帮助。
所以我开始使用某个字符串,让我们称之为 startString 。
我有一个特定的字符串,我想通过应用后面解释的规则,称为 stopString 。
现在让我们举个例子:
startString = "A"
stopString = "2403"
此示例的规则如下:
A->BC
B->D
B->ED
C->F
C->FB
E->0
D->2
D->3
F->4
E->1
程序将采用上述输入并输出应用于从startString到stopString的最小转换列表, 可能 以下内容:
A->BC, B->D, C->FB, B->ED, D->2, F->4, E->0, D->3
我的问题是:CYK如何帮助我?我如何获得" 2403"来自" A"使用CYK?这个问题有没有更简单的解决方案?
答案 0 :(得分:0)
我将首先用乔姆斯基范式写出你的语法。目前有两条规则不能满足这个属性;即
B->D
C->F
解决这个问题的一种天真的方法是将它们分解为三个规则:
B->2
B->3
C->4
现在您的生产规则是
A->BC
B->ED
B->2
B->3
C->4
C->FB
D->2
D->3
E->0
E->1
F->4
我使用(here)的求解器不允许数字作为终端。因此,我只是创建一个双射映射
0 <-> a
1 <-> b
2 <-> c
3 <-> d
4 <-> e
新目标字符串为"cead"
而非"2403"
。将其插入我的求解器会产生生产规则。
Enter the start Variable A
Number of productions 11
A->BC
B->d
B->ED
C->e
C->FB
E->a
D->c
D->d
F->e
E->b
B->c
Enter string to be checked : cead
A
C
A B
DB CF E BD
String can be generated
不幸的是,由于天真的修复,规则有点模糊;但是,我认为这就足够了。