特定语言的上下文敏感语法

时间:2014-04-24 14:17:03

标签: theory context-sensitive-grammar

嘿,我已经在这个问题上坚持了几天,甚至在我的教科书中遇到样本问题以及样本解决方案,我无法弄清楚如何使这个语法工作。

为这种语言提供语法L:

L = { a^n^2 : n ≥ 0 }

我知道这可能是一个含糊不清的问题,但我真的可以使用一些帮助来解决这个问题。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我的回答可能会迟到。我希望它对你(或其他读者)有用。

S -> a
S -> aIIIE

Finish counting:

aII -> aaFI
aFII -> aaFI
aFIE -> aa


Going on counting:

Produce "a"s and "J"s
aII -> aCaLPI
PII -> aLPI
PIE -> aRRRE

Move ALL "a"s to the left:
La -> aL
LR -> RR
Ca -> aC

Convert "R"s to "I"s:
CR -> IC
CE -> E

州名:

S : Start
E : "End"
I : "1" 
F : "Finish"
P : "Produce"
L : "Left"
R : "Right"
C : "Convert"

说明:

让我也勾勒出解决方案的想法。 平方数始终是奇数序列的总和。 例如。 2 ^ 2 = 1 + 3 = 4,3 ^ 2 = 1 + 3 + 5 = 9,等等。

数学上:“总和超过2 * k-1的k在1和n之间”= n ^ 2

你实际需要做的只是计算奇数。 说起来容易做起来容易。

我的语法是这样的:

在左侧,您有上一个结果。 下一个奇数由同一个非终端的奇数表示(在我的例子中为“I”)。 所以我算得像aIIIE,aaaaIIIIIE等等。 无论何时达到该状态,您总是决定是继续计数还是完成计数。

当你继续计算时,你需要产生I次“a”和同一时间(I + 2) - 次“我再次”。 然而,“我”和“a”将按顺序混合。 因此,您必须引入一些将所有“a”移动到左侧的机制 (以及所有“我”在右边)。 此外,你必须始终限制言论自由 这样无论如何都不能留下你的“当前路径”。 否则你可以在生产中遇到一个deadend。 (“F”,“P”,“L”,“R”,“C”,“E”适用于此。)

我想用n = 2和n = 3来演示它。 这应该足够了。

“* - >” 中:“生产”

n = 2时:

aIIIE
(aII)IE *-> (aaFI)IE
a(aFII)E *-> a(aaFI)E
aa(aFIE) *-> aa(aa)
aaaa

n = 3时:

aIIIE
(aII)IE *-> (aCaLPI)IE
aCaL(PII)E *-> aCaL(aLPI)E
aCaLaL(PIE) *-> aCaLaL(aRRRE)
a(Ca)LaLaRRRE *-> aaCLaLaRRRE
aaCLa(La)RRRE *-> aaCLa(aL)RRRE 
aaCLaa(LR)RRE *-> aaCLaa(RR)RRE
aaC(La)aRRRRE *-> aaC(aL)aRRRRE
aaCa(La)RRRRE *-> aaCa(aL)RRRRE
aa(Ca)aLRRRRE *-> aa(aC)aLRRRRE
aaa(Ca)LRRRRE *-> aaa(aC)LRRRRE
aaaaC(LR)RRRE *-> aaaaC(RR)RRRE
aaaa(CR)RRRRE *-> aaaa(IC)RRRRE
aaaaI(CR)RRRE *-> aaaaI(IC)RRRE
aaaaII(CR)RRE *-> aaaaII(IC)RRE
aaaaIII(CR)RE *-> aaaaIII(IC)RE
aaaaIIII(CR)E *-> aaaaIIII(IC)E
aaaaIIIII(CE) *-> aaaaIIIII(E)
aaaaIIIIIE