Non-Context-Free Languages

난1렙이요·2024년 11월 5일

컴퓨테이션 이론

목록 보기
16/22

Non-Context-Free Languages

  • Regular Language를 공부할 때, Regular Language에 속하지 않는 Language도 공부하였다.
  • 이와 비슷하게, Context-Free Language를 공부했으면, Context-Free Language에 속하지 않는 Language도 알아야 한다.
  • Regular language의 pummping lemma와 비슷하게, Context-Free Language에는 Pumping length가 있다.
  • Pumping Length는 특별한 값으로, context-free language가 "pumped"되기 위한 최소한의 길이이다.
  • string은 다섯 부분으로 나뉘며, 두번째 부분과 네번째 부분은

Pumping Lemma for context-free language

만약 AA가 context-free language라면,pp (the pumping length)가 있다. 이 pp는 만약 임의의 s가 A안에 포함되고, p보다 길이가 길면, s는 다섯 부분인 s=uvxyzs = uvxyz로 나누어질 수 있다.

임의의 s=uvxyzs = uvxyz는 다음과 같은 조건을 모두 만족한다.
1. 모든 i0i ≥ 0에 대해서, s=uvixyizAs' = uv^ixy^iz ∈ A
2. vy>0|vy| > 0
3. vxyp|vxy| ≤ p

  • vvyy 모두 εε일 순 없다.
  • v,x,yv,x,y의 길이를 더하면 아무리 길어져도 pp보다 길어질 수 없다.

Proof Idea

  • AA는 CFL이며 이를 생성하는 CFG GG가 있다.
  • AA안에 속하는 임의의 string ss가 pumped된다는 것을 증명한다.
  • ssAA에 속하는 아주 긴 string이라고 가정하자.
  • ssAA에 속하므로, GG를 derivable하며 그러므로 parse tree를 가진다.
  • ss의 parse tree는 굉장히 높은데, ss가 길기 때문이다.
    • 이 말은, parset tree는 long path를 가진다.
    • long path는 시작 상태를 root로 가지며, 단 하나의 terminal symbol을 leaf에서 가진다.
  • 이 long path에서 어떠한 variable symbol R은 비둘기 집 원리에 따라서 반복되어야 한다.
  • ss를 나누어보자
    • variable symbol R은 반복이 무조건 나온다.
    • R이 만드는 string을 x라고 부른다.
    • R이 첫번째 나올 때부터 두번째 나올 때까지 앞부분을 vv, 뒷부분을 yy라고 하자.
    • R이 나오기 전에 앞부분을 uu, 뒷부분을 zz라고 하자.
  • ss'd은 R을 여러번 반복한다는 의미이다. 다시말해 v>viv -> v^i, y>yiy -> y^i이다.

Proof

  • CFG GG는 CFL AA로부터 나왔다
  • bbGG의 규칙 중 오른쪽에 있는 symbol의 개수 중 최대값이다.
    • S0S1S → 0S1
    • S#S → \#
      이 두가지 경우에 대해서 b=3b=3이다.
  • 하나의 노드는 자식을 bb개 이상 가질 수 없다는 의미이다.
  • 다시 말해, 모든 노드는 최대 bb개의 자식을 가지므로, hh의 과정을 거친 leaf에는 bhb^h개의 symbol이 생긴다는 의미이다.
  • 그러므로 parse tree의 최대 높이가 hh면, string의 길이는 최대 bhb^h이다.
  • 이를 응용하면, 만약 만들어진 string의 길이가 bh+1b^h+1이면, parse tree는 h+1h+1보다 높아야 한다.
  • |V|는 GG의 변수의 개수라고 해보자
  • 우리는 ppbV+1b^{|V|+1}로 정의할 수 있다.
  • 이제 s가 A안에 속하고, 길이가 pp보다 길거나 같으면, parse tree는 V+1|V|+1보다 높아야 한다. bV+1>bV+1b^{|V|+1} > b^{|V|}+1
  • ss로 인해 만들어지는 parse tree중 하나를 ττ라 하자.
  • ss가 여러개의 parse tree를 가질 때, ττ는 node의 개수가 가장 작은 parse tree이다.
  • ττ의 높이는 V+1|V|+1보다 높아야 한다.
  • 여기서 도출되는 건, ττ의 길이가 V+1|V|+1보다 높으므로 root에서 leaf까지 가는 path는 길이가 적어도 V+1|V|+1이다.
  • 이 path는 적어도 V+2|V|+2개의 노드를 가지고 있다. terminal은 하나이고, 나머지는 variable이다.
  • 그러므로 path안에 variable은 V+1|V|+1개가 있다.
  • 증명하기 전, RR을 선택할 때 path의 아래서부터 반복되는 RR을 선택한다.
  • upper RRvxyvxy를 만든다.
  • lower RRxx를 만든다.
  • i>1i > 1일 때, lower RR을 upper RR로 만든다.
  • i=0i = 0일 때, upper RR을 lower RR로 만든다.
  • Condition 2 : vvyy중 하나는 εε이 아니다.
    • 만약 위가 성립한다고 가정하자.
    • ττv=εv=ε 이고 y=εy=ε이다.
    • s=uv0xy0zs' = uv^0xy^0z을 만들어보자.
    • 이 때, s=ss' = s이다.
    • ττ'ss'의 node의 개수가 가장 작은 parse tree라고 정의하자. ττ'ττ보다 노드 개수가 적다.
    • 그러나 s=ss' = s이므로 ττ'ss를 만들 수 있다.
    • 이 말은 ττss의 node개수가 가장 작은 parse tree가 아니라는 의미이다.
    • 그러므로 ττ의 정의에 대한 모순이 일어난다.
  • Condition 3 : vxyvxypp보다 길이가 길 수 없다.
    • upper R=vxyR = vxy가 존재한다.
    • V+1|V|+1의 길이인 맨 아래에서부터 path를 따라서 올라갈 때 반복이 나오지 않고 최대한 올라갈 수 있는 높이는 V+1|V|+1이다.
    • 높이가 V+1|V|+1일 때, symbol의 최대 개수는 bV+1=pb^{|V|+1} = p이다.
    • 그러므로 vxyp|vxy| ≤ p이다.

Example

  • B={anbncnn0}B = \{a^nb^nc^n | n ≥ 0\}
  • 다음에 대해서 context free가 아니라는 것을 증명하자.
  • 이를 위해 BB가 Context-Free라고 가정하자.
  • BB는 pumping lemma를 만족해야한다.
  • pp는 pumping length이다.
  • string s=apbpcps = a^pb^pc^p를 선택한다.
  • sBs ∈ B이며, sp|s| ≤ p임이 명백하다.
  • s=uvxyzs = uvxyz로 나누었을 때 아래 조건을 모두 만족해야 한다.

임의의 s=uvxyzs = uvxyz는 다음과 같은 조건을 모두 만족한다.
1. 모든 i0i ≥ 0에 대해서, s=uvixyizAs' = uv^ixy^iz ∈ A
2. vy>0|vy| > 0
3. vxyp|vxy| ≤ p

  • 첫번째로, Condition 2에 의해 vvyy중 하나는 εε이 아니다.
  • 다음으로 우리는 2가지 상황을 고려할 수 있다.
  1. vvyy는 하나의 symbol만 가지고 있다. 다시 말해 a,b,ca,b,c중 오직 하나만 가져야 한다.
    • s=uv2xy2zs' = uv^2xy^2z를 가정해보자.
    • uv2xy2zuv^2xy^2za,b,ca,b,c의 개수가 모두 같을 수 없다.
    • 만약 vvaa만 가지면, yyaa만 가지거나 bb만 가지거나 cc만 가진다.
    • 그러므로 a,b,ca,b,c중 최대 두개는 늘어나고 하나는 그대로이다.
    • 만약 vvbb만 가지면, yybb만 가지거나 cc만 가진다.
    • 그러므로 b,cb,c는 가지는 범위에 따라서 늘어나고 aa는 그대로이다.
    • 만약 vvcc만 가지면, yycc만 가진다..
    • 그러므로 cc는 늘어나고 a,ba,b는 그대로이다.
    • 그러므로 개수는 모두 같을 수 없다.
  2. vvyy는 두개 이상의 symbol을 가지고 있다. 다시 말해 a,b,ca,b,c가 바뀌는 경계선을 가지고 있다.
    • s=uv2xy2zs' = uv^2xy^2z를 가정해 보자.
    • vvyy는 두개 이상의 symbol을 가지고 있으므로 패턴에 어긋나게 된다.
  • C={aibjck0ijk}C = \{a^ib^jc^k | 0 ≤ i ≤ j ≤ k\}
  • 다음에 대해서 context free가 아니라는 것을 증명하자.
  • 이를 위해 CC가 Context-Free라고 가정하자.
  • CC는 pumping lemma를 만족해야한다.
  • pp는 pumping length이다.
  • string s=apbpcps = a^pb^pc^p를 선택한다.
  • sCs ∈ C이며, sp|s| ≤ p임이 명백하다.
  • s=uvxyzs = uvxyz로 나누었을 때 아래 조건을 모두 만족해야 한다.

임의의 s=uvxyzs = uvxyz는 다음과 같은 조건을 모두 만족한다.
1. 모든 i0i ≥ 0에 대해서, s=uvixyizAs' = uv^ixy^iz ∈ A
2. vy>0|vy| > 0
3. vxyp|vxy| ≤ p

  1. vvyy는 하나의 symbol만 가지고 있다. vv,yya,b,ca,b,c 3개의 symbol중 하나에는 없다.
    1.a aa쪽에 없는 경우이다. uv0xy0z=uxzuv^0xy^0z = uxzaa의 개수가 동일하지만 bbccaa보다 개수가 작아지므로 조건을 만족하지 못한다.
    1.b bb쪽에 없는 경우이다. 이러면 aacc는 무조건 나와야 한다. 왜냐하면 v|v|y|y|는 0보다 크기 때문이다.

    • aa가 나오면 uv2xy2z=uxzuv^2xy^2z = uxz을 사용한다. 이는 aa의 개수가 bb보다 커지므로 조건을 만족하지 못한다.
    • cc가 나오면 uv0xy0z=uxzuv^0xy^0z = uxz을 사용한다. 이는 cc의 개수가 bb보다 작아지므로 조건을 만족하지 못한다.

    1.c cc쪽에 없는 경우이다. uv2xy2zuv^2xy^2zcc의 개수가 동일하지만 aabbcc보다 개수가 커지므로 조건을 만족하지 못한다.

  2. vvyy는 두개 이상의 symbol을 가지고 있다. 다시 말해 a,b,ca,b,c가 바뀌는 경계선을 가지고 있다.

    • s=uv2xy2zs' = uv^2xy^2z를 가정해 보자.
    • vvyy는 두개 이상의 symbol을 가지고 있으므로 패턴에 어긋나게 된다.
  • D={www{0,1}}D = \{ ww | w ∈ \{0,1\}^* \}
  • 다음에 대해서 context free가 아니라는 것을 증명하자.
  • 이를 위해 DD가 Context-Free라고 가정하자.
  • DD는 pumping lemma를 만족해야한다.
  • pp는 pumping length이다.
  • ss를 찾는 과정은 굉장히 오래 걸릴 것이다. 어떻게 보면 안된다고 생각할 수도 있다.
  • 만약 string s=0p10p1s = 0^p10^p1를 선택했다고 본다.(이 경우는 통과하지 못함)
  • sDs ∈ D이며, sp|s| ≤ p임이 명백하다.
  • uv0xy0z=uxzuv^0xy^0z = uxz0p110p110^{p-1}10^{p-1}1이 된다. 이것은 조건에 만족한다.
  • uvixyizuv^ixy^iz0p+i110p+i110^{p+i-1}10^{p+i-1}1이 된다. 이것은 조건에 만족한다.
  • 그러므로 잘못 뽑은 string s=0p10p1s = 0^p10^p1는 귀류법을 증명하지 못ㅎ나다.
  • string s=0p1p0p1ps = 0^p1^p0^p1^p를 선택한다.
  • sDs ∈ D이며, sp|s| ≤ p임이 명백하다.
  • s=uvxyzs = uvxyz이고 vxyp|vxy|≤ p다.
  • 이 경우 3가지 과정을 통해 증명할 수 있다.
  1. vxyvxyss의 가운데를 포함해야 한다.
    • 만약 ss 절반의 앞에 있다고 해보자.
    • uv2xy2zuv^2xy^2zss 절반의 앞에 숫자들이 추가된다는 의미이다.
    • 이 경우 uv2xy2zuv^2xy^2z의 가운데는 앞으로 옮겨간다.
    • 그러나 이 경우 가운데가 1의 영역을 침범하므로 ww가 앞은 0으로 시작하고 뒤는 1로 시작하게 된다.
    • ss 절반의 뒤에 있는 경우도 비슷하다.
    • 그러므로 vxyvxyss의 가운데를 포함해야 한다.
  2. vxyvxyss의 가운데를 포함해야 한다.
    • 이 경우 uv0xy0z=uxzuv^0xy^0z = uxz0p1i0j1p0^p1^i0^j1^p가 된다.
    • ipi≠p이거나 jpj≠p이다.
    • 그러므로 같은 ww가 나올 수 없다.
profile
다크 모드의 노예

0개의 댓글