context-free-grammar - 我如何获得这种语言的上下文无关语法?
问题描述
使用这种语言:
L = {x^i, y^j, z^k : i != j ∨ j != k; i ≥ 0; j ≥ 0; k ≥ 0}, Σ = {x, y, z}
如何获得这种语言的上下文无关语法?
解决方案
有一些技巧可以用来解决这样的问题,这个问题至少得益于其中的几个:
始终根据联合和逻辑“或”拆分语言。在这种情况下,我们的语言
L = {x^i, y^j, z^k : i != j ∨ j != k; i ≥ 0; j ≥ 0; k ≥ 0}
在条件中有一个逻辑“或”,因此等价于两种语言与条件拆分的并集:L = L1 U L2
whereL1 = {x^i, y^j, z^k : i != j; i ≥ 0; j ≥ 0; k ≥ 0}
和L2 = {x^i, y^j, z^k : j != k; i ≥ 0; j ≥ 0; k ≥ 0}
。可以通过引入一个新的开始非终结符来形成两个 CFL 的并集的 CFG,该非终结符生成 CFL 的 CFG 的每个开始非终结符。将复杂条件重写为涉及简单条件的等效表达式,理想情况下,您已经知道如何编写 CFG。例如,
i != j
等价于i < j ∨ i > j
。这允许我们将L1
andL2
从上面重写为L1 = {x^i, y^j, z^k : i < j ∨ i > j; i ≥ 0; j ≥ 0; k ≥ 0}
andL2 = {x^i, y^j, z^k : j < k ∨ j > k; i ≥ 0; j ≥ 0; k ≥ 0}
。请注意,我们现在可以重写L1 = L3 U L4
并L2 = L5 U L6
使用上面的考虑,所以L = L3 U L4 U L5 U L6
whereL3 = {x^i, y^j, z^k : i < j; i ≥ 0; j ≥ 0; k ≥ 0}
、L4 = {x^i, y^j, z^k : i > j; i ≥ 0; j ≥ 0; k ≥ 0}
和。L5 = {x^i, y^j, z^k : j < k; i ≥ 0; j ≥ 0; k ≥ 0}
L6 = {x^i, y^j, z^k : j > k; i ≥ 0; j ≥ 0; k ≥ 0}
这些的 CFG 更容易生成:
S3 := S3 z | T3
T3 := x T3 y | T3 y | y
S4 := S4 z | T4
T4 := x T4 y | x T4 | x
S5 := x S5 | T5
T5 := y T5 z | S5 z | z
S6 := x S6 | T6
T6 := y T6 z | y S6 | y
要完成语法,只需使S
' L
s CFG 的开始符号产生每个开始符号S3, S4, S5, S6
:
S := S3 | S4 | S5 | S6
推荐阅读
- azure-functions - Azure 函数:“超过多部分正文长度限制 16384。”
- oauth-2.0 - 如果应用程序已连接到 Dropbox,如何获取访问令牌?
- r - 值之间的线性插值
- tableau-api - 使用此索引计算字段按增量显示标记?
- c++ - 如何将正则表达式添加到 C++ 类?
- c - 使用一维数组和for循环的C语言字符猜谜游戏
- python - 使用带有 NSGA2 的 python DEAP 库解决多目标优化问题
- python - keras 功能 API 中的 3D 输入到 2D 输出
- javascript - Javascript [CANVAS]“减慢帧率?”
- coq - 如何将符号范围绑定到类型