Computer science 一元加法的上下文无关文法

Computer science 一元加法的上下文无关文法,computer-science,context-free-grammar,Computer Science,Context Free Grammar,给定一个1的字母表,我想解析形式的加法 1^k + 1^j = 1^k+j 这很容易用下推自动机表示,只需在前两个1的每个1上将1推到堆栈上,然后在最后一组1上弹出。然而,我似乎不知道如何将其表示为上下文无关语法,这显然是可能的,因为PDA==CFG。我的建议是从一个简单的起点开始: 1+1=11 现在,试着弄清楚如何用合法的CFG表达式来“增长” 或者,我刚才解决了这个问题,尝试用“匹配括号”对其进行扩展,这是CFGs的一个常见介绍问题。这显然很难,但你可能会找到一条富有成效的道路 希望这有

给定一个1的字母表,我想解析形式的加法

1^k + 1^j = 1^k+j

这很容易用下推自动机表示,只需在前两个1的每个1上将1推到堆栈上,然后在最后一组1上弹出。然而,我似乎不知道如何将其表示为上下文无关语法,这显然是可能的,因为PDA==CFG。

我的建议是从一个简单的起点开始: 1+1=11 现在,试着弄清楚如何用合法的CFG表达式来“增长”

或者,我刚才解决了这个问题,尝试用“匹配括号”对其进行扩展,这是CFGs的一个常见介绍问题。这显然很难,但你可能会找到一条富有成效的道路

希望这有帮助!狩猎快乐


Agor

如果您将RHS重写为
1^j1^k
,那么您应该看到它只是两组嵌套的平衡
1
s。结合
1+1=11
的“基本情况”,您应该能够在内部增加“j”s,在外部增加“k”s。

是的,这一点在过去的一个小时里一直困扰着我


而且,cdiggins,1+1=111将通过该测试,我也一直在研究这个问题,但无法让它发挥作用。这对我来说最有意义:

A->B+B=BB B->BB B->1


但是是的,它接受像1+111=11和11+1=111111这样的字符串和其他无意义的字符串。这里的人似乎知道但不想分享。这并不是我们可以在谷歌上搜索并得到有意义的帮助的东西。你觉得你能帮上点忙吗?

一般一元加法对于上下文无关语法或下推自动机是不可能的。对于这种类型的计算,必须使用图灵机。编写将1推送到堆栈上的下推自动机是无效的,因为堆栈实际上不是PDA的输出。PDA的唯一输出是二进制“接受”或“拒绝”,它指示输入字符串是否是PDA识别的语言的一部分

S   ->  1 + 1 = 11
S   ->  1S1
S   ->  1 + 1A11
A   ->  1 = 1
A   ->  1A1
前两行构成第一项和具有相同数量的一的和。构造第一个项后,使用“A=>+1B1”移动到第二个项。第三行构造第二个项,同时向总和添加相等数量的1。一旦完成,equals转换就完成了


请注意,这不允许表达式中的任何项等于零。另外,你也可以构造一元负号表达式,只需稍加修改,记住a-b=c相当于a=b+c

我知道这是一个老问题,我读过戈德尔、埃舍尔、巴赫的书,也遇到了类似的问题(为pq系统生成语法)

因此,对于OP的问题,我想以下生成规则应该可以:

第一->1+第二1 | 1第一
第二->1=1 | 1second1

加法是一种二进制运算,不是吗。还是我没有得到什么?还有什么是1的字母表和“下推自动机”?你是说递归后代解析器吗?你可能想从写BNF开始。从表达式开始,然后向下移动到指数,然后是术语等。奥利:这是一个关于计算模型的正式定义的问题。图灵机是最有名的,这里有一个PDA的wiki:。解析和语言设计研究与此类自动机相关,但它们通常被用作研究可计算性的方法。有一种算法可以将任意下推自动机转换为生成PDA语言的上下文无关语法。如果您有PDA,将其转换为CFG只是一个机械过程。是否需要在此详细说明一下?:)
S => 1A1
A => 1A1 | +1B1
B => 1B1 | =