跳到主要内容

東京工業大学 情報理工学院 数理・計算科学系 2017年8月実施 午前 問7

Author

祭音Myyura (co-authored with GPT 5.6 SOL)

Description

整数定数 11、二項演算 ++、単項演算 - からなる算術式の後置記法を定める、次の文脈自由文法 GG を考える。ただし、開始記号は EE である。

E1EE+EE \to 1 \mid EE+ \mid E-

例えば、111++111++ および 11+11+-GG が生成する文字列である。以下の問いに答えよ。

  1. アルファベット {1,+,}\{1,+,-\} 上の文字列 ww に含まれる 11 の個数を #1(w)\#_1(w)++ の個数を #+(w)\#_+(w) とし、#(w)=#1(w)#+(w)\#(w)=\#_1(w)-\#_+(w) と定める。例えば、#1(111++)=3\#_1(111++)=3#+(111++)=2\#_+(111++)=2#(111++)=1\#(111++)=1 である。GG が生成する任意の文字列 ww について #(w)=1\#(w)=1 となることを示せ。
  2. GG が生成する言語が正規言語でないことを、正規言語の反復補題を用いて示せ。
  3. 言語 L(G)={wwε  w(wwL(G))}L(G')=\{w'\mid w'\ne\varepsilon\ \land\ \exists w\,(w'w\in L(G))\} を生成する文脈自由文法 GG' を示せ。ここで ε\varepsilon は空列である。
  4. GG が生成する任意の文字列 ww と、空でない文字列 ww' に対して、www'wGG が生成する文字列ではないことを示せ。

注:ポンピング補題

言語 LL が正規言語であるとき、次のような数 pp(ポンピング長)が存在する。sssp|s|\geq p を満たす LL の任意の文字列であるとき、ss は次の条件を満たすように三つの部分 s=xyzs=xyz に分割できる。

  1. 各々の i0i\geq0 に対して xyizLxy^iz\in L
  2. y>0|y|>0
  3. xyp|xy|\leq p

ただし、s|s| は文字列 ss の長さを表し、yiy^iyyii 個連結したものを表す。y0y^0 は空列となる。

题目描述

考虑用整数常量 11、二元运算 ++ 和一元运算 - 表示后缀算术表达式的上下文无关文法 GG,其开始符号为 EE

E1EE+E.E\to1\mid EE+\mid E-.

例如,111++111++11+11+- 都是 GG 生成的字符串。回答:

  1. 对字母表 {1,+,}\{1,+,-\} 上的字符串 ww,分别以 #1(w)\#_1(w)#+(w)\#_+(w) 表示其中字符 11++ 的个数,并定义

    #(w)=#1(w)#+(w).\#(w)=\#_1(w)-\#_+(w).

    例如,#1(111++)=3\#_1(111++)=3#+(111++)=2\#_+(111++)=2#(111++)=1\#(111++)=1。证明 GG 生成的每个字符串 ww 都满足 #(w)=1\#(w)=1

  2. 使用正则语言的抽引引理,证明 GG 生成的语言不是正则语言。

  3. 给出一个上下文无关文法 GG',其语言为 L(G)={wwε  w(wwL(G))}L(G')=\{w'\mid w'\ne\varepsilon\ \land\ \exists w\,(w'w\in L(G))\},即所有能扩展成 GG 所生成字符串的非空前缀组成的语言。这里 ε\varepsilon 表示空串。

  4. 证明:对任意由 GG 生成的字符串 ww 和任意非空字符串 ww',拼接串 www'w 都不可能由 GG 生成。

注:抽引引理

若语言 LL 是正则语言,则存在一个数 pp(抽引长度),使任意满足 sLs\in Lsp|s|\geq p 的字符串都可以分解为 s=xyzs=xyz,并满足:

  1. 对每个 i0i\geq0,均有 xyizLxy^iz\in L
  2. y>0|y|>0
  3. xyp|xy|\leq p

这里 s|s| 表示字符串 ss 的长度,yiy^i 表示将 yy 连续拼接 ii 次,y0y^0 为空串。

Kai

(1)

生成規則に関する構造帰納法で示す。

  • E1E\Rightarrow 1 のとき、#(1)=1\#(1)=1 である。

  • EEE\Rightarrow E- のとき、-#1\#_1#+\#_+ のどちらにも影響しないため、値は変わらない。

  • EEE+E\Rightarrow EE+ のとき、二つの部分式を u,vu,v とすれば、帰納法の仮定から

    #(uv+)=#(u)+#(v)1=1+11=1.\#(uv+)=\#(u)+\#(v)-1=1+1-1=1.

したがって、GG が生成するすべての文字列 ww について #(w)=1\#(w)=1 である。

(2)

L(G)L(G) が正規言語であると仮定し、その反復長を pp とする。文字列

s=1p+p1s=1^p+^{p-1}

は、pp 個の式 11++ で順に結合した後置記法の式なので sL(G)s\in L(G) である。

反復補題によって s=xyzs=xyzxyp|xy|\le py>0|y|>0 と分解できる。このとき最初の pp 文字はすべて 11 なので、ある r1r\ge 1 に対して y=1ry=1^r である。yy を 0 回反復すると

#(xz)=(pr)(p1)=1r1.\#(xz)=(p-r)-(p-1)=1-r\ne 1.

(1) より xzL(G)xz\notin L(G) であり、反復補題に矛盾する。ゆえに L(G)L(G) は正規言語ではない。

(3)

次の文法を用いればよい。開始記号は SS とする。

SEES,E1EE+E.\begin{aligned} S&\to E\mid ES,\\ E&\to 1\mid EE+\mid E-. \end{aligned}

この文法は、一つ以上の完全な式を並べた文字列 E1E2EdE_1E_2\cdots E_d を生成する。

後置記法を左から読んだとき、正しい式の空でない接頭辞を読み終えたスタックには、未結合の完全な式が d1d\ge 1 個残っている。したがって、その接頭辞は E1E2EdE_1E_2\cdots E_d と表せる。逆に、このような文字列の末尾に +d1+^{d-1} を付ければ一つの式に結合できるので、生成された文字列は必ず L(G)L(G) のある文字列の接頭辞である。

(4)

wwL(G)w'w\in L(G) と仮定する。ww' は正しい後置式の空でない接頭辞なので、(3) の議論から

#(w)1\#(w')\ge 1

である。一方、wL(G)w\in L(G) なので (1) より #(w)=1\#(w)=1 である。したがって

#(ww)=#(w)+#(w)2,\#(w'w)=\#(w')+\#(w)\ge 2,

となり、(1) の必要条件 #(ww)=1\#(w'w)=1 に矛盾する。よって wwL(G)w'w\notin L(G) である。