L = {1i - 1j = 1i-j: i-j >= 0, i,j>=0}
我对如何构建跟踪字符串元素减法的语法感到困惑。我不知道如何开始这个并试图使用形式的等效构造
L = {1i = 1i-j + 1j}
任何提示或建议都表示赞赏。
答案 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^n
和S -> 1S1
等规则。
其次,请注意,如果我们将S -> T
和1^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 + t
,j = t
和i - j = s + t - t = s
,因此语法应该只生成语言中的字符串。但它是否会生成语言中的所有字符串?我们可以通过数学归纳来确定字符串中=
的数量。在我们开始之前,请注意1
的数量必须始终是偶数,因为如果1
s的一个或全部三个字符串具有奇数长度,则等式永远不会成立,并且这些是1
的总数可能是奇数的唯一情况。
基本案例:1
中只有一个字符串没有L
,即1
,它由- =
派生。
归纳假设:假设语法生成S -> T = -> - =
中L
个k
个1
个实例的所有字符串。
归纳步骤:我们需要显示包含k + 2
的任何字符串(请记住,1
中任何字符串中L
的数量必须是我们之前观察到的1
个{可以通过语法生成{1}}。我们的字符串可以写成1^a - 1^b = 1^c
,其中a + b + c = k + 2
,a - b = c
c <= a
和b <= a
必须为真。如果a = b
和c = 0
,那么k
中的a' = a - 1
和b' = b - 1
字符串长度为L
;通过归纳假设,它是由语法生成的,通过检查,我们看到我们可以在导出中插入T -> 1T1
的另一个应用程序,然后用T -> -
结束它以获取我们的字符串。另一方面,如果a > b
为L
,则a' = a - 1
和c' = c - 1
中的字符串较短。通过归纳假设,这是由我们的语法生成的,通过检查,我们看到我们可以在S -> 1S1
之前向S -> T =
中的k + 2
插入额外的应用程序以获取我们的字符串。在这两种情况下,语法都会生成长度为L
的字符串,因此 $data = request()->except(['_token','id']);
DB::table($table)->where('id',$id)->update($data);
中的所有字符串都是由语法生成的。