一元减法的无上下文语法建议?

时间:2017-10-18 20:19:01

标签: context-free-grammar

L = {1i - 1j = 1i-j: i-j >= 0, i,j>=0}

我对如何构建跟踪字符串元素减法的语法感到困惑。我不知道如何开始这个并试图使用形式的等效构造

L = {1i = 1i-j + 1j}

任何提示或建议都表示赞赏。

2 个答案:

答案 0 :(得分:2)

这里有一个提示:总是尝试在括号平衡方面考虑无上下文语言。

考虑以下两种语言:

ab             ()
aabb          (())
aaabbb       ((()))
aaaabbbb    (((())))
...            ...

我们大多数人“看到”第一种语言是重复(其中一些是后跟相同数字的b),第二种语言是嵌套。但是这两种语言的无上下文语法是相同的:

S: ab       S: ()
 | a S b     | ( S )

因为CFG正在使用堆栈自动机进行解析,所以嵌套很自然。第一种语言实际上是一些数字,其后是相同数量的b,反转。当然,一些b和一些b的反转看起来完全一样......直到你绘制了派生树。

因此,请考虑一元加法语:{ 1i+j = 1i + 1j }

显然,这与{ 1j+i = 1i + 1j }相同(切换添加顺序没有区别)。或者,将添加内容写为简单的连接:{ 1j 1i = 1i + 1j }。现在,我们可以将对称性分组:(这里的括号是metasymbols来显示分组,而不是语言的一部分):{ 1j ( ( 1i = 1i ) + ) 1j }

导致

L1 → =
L1 → 1 L1 1
L2 → L1 +
L2 → 1 L2 1

在CFG中,添加有点模糊,但很明显发生了什么:我们允许在=的两边使用相同数量的1的句子,只有一个{{ 1}}被插入右侧的任何地方。 (通过非常简单的语法更改,我们可以允许多个+符号,使语法接受带有多个加数的加法方程式。)

答案 1 :(得分:1)

每当我看到这些问题时,我会尝试考虑语言中最小的字符串然后规则来获得更大的字符串。如果我们允许- =,则此语言中的最小字符串可能为i - j, i, j = 0;我可能会质疑这是否可以被认为是一元中0 - 0 = 0的正确编码,但我离题了。如果您需要i - j, i, j > 0并将11 - 1 = 1视为您语言中最短的字符串,则以下推导同样有效。我们如何在语言中获得更长的字符串?

首先,请注意我们可以将1添加到字符串的开头和结尾,并使用该语言获取另一个字符串:- =是一个字符串,1 - = 1,{ {1}},...,11 - = 11。这表明我们会有1^n - = 1^nS -> 1S1等规则。

其次,请注意,如果我们将S -> T1^i - 1^j分别增加1,则差异i将保持不变。因此,如果j是我们的语言,那么1^i - 1^j = 1^(i+j)也是如此。显然,我们需要一条规则,允许我们在1^(i+1) - 1^(j+1) = 1^(i+j)1之间放置一些-,因为我们还没有。{1}}。这一观察结果表明,当我们这样做时,我们必须在=之前放置一个。我们可能会猜测一个好的规则是-

到目前为止考虑到我们的语法,我们有:

T -> 1T1 | -

这给了我们S -> 1T1 | T T -> 1T1 | - 。这实际上非常接近,但我们缺少1^s 1^t - 1^t 1^s。我们认为它需要在=之后,事实上,我们可以将它添加到生产T中以获取

S -> T

这给了我们S -> 1S1 | T = S -> 1T1 | - 。由于我们在1^s 1^t - 1^t = 1^s的右侧有i = s + tj = ti - j = s + t - t = s,因此语法应该只生成语言中的字符串。但它是否会生成语言中的所有字符串?我们可以通过数学归纳来确定字符串中=的数量。在我们开始之前,请注意1的数量必须始终是偶数,因为如果1 s的一个或全部三个字符串具有奇数长度,则等式永远不会成立,并且这些是1的总数可能是奇数的唯一情况。

基本案例:1中只有一个字符串没有L,即1,它由- =派生。

归纳假设:假设语法生成S -> T = -> - =Lk1个实例的所有字符串。

归纳步骤:我们需要显示包含k + 2的任何字符串(请记住,1中任何字符串中L的数量必须是我们之前观察到的1个{可以通过语法生成{1}}。我们的字符串可以写成1^a - 1^b = 1^c,其中a + b + c = k + 2a - b = c c <= ab <= a必须为真。如果a = bc = 0,那么k中的a' = a - 1b' = b - 1字符串长度为L;通过归纳假设,它是由语法生成的,通过检查,我们看到我们可以在导出中插入T -> 1T1的另一个应用程序,然后用T -> -结束它以获取我们的字符串。另一方面,如果a > bL,则a' = a - 1c' = c - 1中的字符串较短。通过归纳假设,这是由我们的语法生成的,通过检查,我们看到我们可以在S -> 1S1之前向S -> T =中的k + 2插入额外的应用程序以获取我们的字符串。在这两种情况下,语法都会生成长度为L的字符串,因此 $data = request()->except(['_token','id']); DB::table($table)->where('id',$id)->update($data); 中的所有字符串都是由语法生成的。