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
만약 A가 context-free language라면,p (the pumping length)가 있다. 이 p는 만약 임의의 s가 A안에 포함되고, p보다 길이가 길면, s는 다섯 부분인 s=uvxyz로 나누어질 수 있다.
임의의 s=uvxyz는 다음과 같은 조건을 모두 만족한다.
1. 모든 i≥0에 대해서, s′=uvixyiz∈A
2. ∣vy∣>0
3. ∣vxy∣≤p
- v와 y 모두 ε일 순 없다.
- v,x,y의 길이를 더하면 아무리 길어져도 p보다 길어질 수 없다.
Proof Idea
- A는 CFL이며 이를 생성하는 CFG G가 있다.
- A안에 속하는 임의의 string s가 pumped된다는 것을 증명한다.
- s가 A에 속하는 아주 긴 string이라고 가정하자.
- s 가 A에 속하므로, G를 derivable하며 그러므로 parse tree를 가진다.
- s의 parse tree는 굉장히 높은데, s가 길기 때문이다.
- 이 말은, parset tree는 long path를 가진다.
- long path는 시작 상태를 root로 가지며, 단 하나의 terminal symbol을 leaf에서 가진다.
- 이 long path에서 어떠한 variable symbol R은 비둘기 집 원리에 따라서 반복되어야 한다.

- s를 나누어보자
- variable symbol R은 반복이 무조건 나온다.
- R이 만드는 string을 x라고 부른다.
- R이 첫번째 나올 때부터 두번째 나올 때까지 앞부분을 v, 뒷부분을 y라고 하자.
- R이 나오기 전에 앞부분을 u, 뒷부분을 z라고 하자.
- s′d은 R을 여러번 반복한다는 의미이다. 다시말해 v−>vi, y−>yi이다.

Proof
- CFG G는 CFL A로부터 나왔다
- b는 G의 규칙 중 오른쪽에 있는 symbol의 개수 중 최대값이다.
- S→0S1
- S→#
이 두가지 경우에 대해서 b=3이다.
- 하나의 노드는 자식을 b개 이상 가질 수 없다는 의미이다.
- 다시 말해, 모든 노드는 최대 b개의 자식을 가지므로, h의 과정을 거친 leaf에는 bh개의 symbol이 생긴다는 의미이다.
- 그러므로 parse tree의 최대 높이가 h면, string의 길이는 최대 bh이다.
- 이를 응용하면, 만약 만들어진 string의 길이가 bh+1이면, parse tree는 h+1보다 높아야 한다.
- |V|는 G의 변수의 개수라고 해보자
- 우리는 p를 b∣V∣+1로 정의할 수 있다.
- 이제 s가 A안에 속하고, 길이가 p보다 길거나 같으면, parse tree는 ∣V∣+1보다 높아야 한다. b∣V∣+1>b∣V∣+1
- s로 인해 만들어지는 parse tree중 하나를 τ라 하자.
- s가 여러개의 parse tree를 가질 때, τ는 node의 개수가 가장 작은 parse tree이다.
- τ의 높이는 ∣V∣+1보다 높아야 한다.
- 여기서 도출되는 건, τ의 길이가 ∣V∣+1보다 높으므로 root에서 leaf까지 가는 path는 길이가 적어도 ∣V∣+1이다.
- 이 path는 적어도 ∣V∣+2개의 노드를 가지고 있다. terminal은 하나이고, 나머지는 variable이다.
- 그러므로 path안에 variable은 ∣V∣+1개가 있다.
- 증명하기 전, R을 선택할 때 path의 아래서부터 반복되는 R을 선택한다.
- upper R은 vxy를 만든다.
- lower R은 x를 만든다.
- i>1일 때, lower R을 upper R로 만든다.
- i=0일 때, upper R을 lower R로 만든다.
- Condition 2 : v와 y중 하나는 ε이 아니다.
- 만약 위가 성립한다고 가정하자.
- τ는 v=ε 이고 y=ε이다.
- s′=uv0xy0z을 만들어보자.
- 이 때, s′=s이다.
- τ′는 s′의 node의 개수가 가장 작은 parse tree라고 정의하자. τ′는 τ보다 노드 개수가 적다.
- 그러나 s′=s이므로 τ′는 s를 만들 수 있다.
- 이 말은 τ가 s의 node개수가 가장 작은 parse tree가 아니라는 의미이다.
- 그러므로 τ의 정의에 대한 모순이 일어난다.
- Condition 3 : vxy는 p보다 길이가 길 수 없다.
- upper R=vxy가 존재한다.
- ∣V∣+1의 길이인 맨 아래에서부터 path를 따라서 올라갈 때 반복이 나오지 않고 최대한 올라갈 수 있는 높이는 ∣V∣+1이다.
- 높이가 ∣V∣+1일 때, symbol의 최대 개수는 b∣V∣+1=p이다.
- 그러므로 ∣vxy∣≤p이다.
Example
- B={anbncn∣n≥0}
- 다음에 대해서 context free가 아니라는 것을 증명하자.
- 이를 위해 B가 Context-Free라고 가정하자.
- B는 pumping lemma를 만족해야한다.
- p는 pumping length이다.
- string s=apbpcp를 선택한다.
- s∈B이며, ∣s∣≤p임이 명백하다.
- s=uvxyz로 나누었을 때 아래 조건을 모두 만족해야 한다.
임의의 s=uvxyz는 다음과 같은 조건을 모두 만족한다.
1. 모든 i≥0에 대해서, s′=uvixyiz∈A
2. ∣vy∣>0
3. ∣vxy∣≤p
- 첫번째로, Condition 2에 의해 v와 y중 하나는 ε이 아니다.
- 다음으로 우리는 2가지 상황을 고려할 수 있다.
- v와 y는 하나의 symbol만 가지고 있다. 다시 말해 a,b,c중 오직 하나만 가져야 한다.
- s′=uv2xy2z를 가정해보자.
- uv2xy2z는 a,b,c의 개수가 모두 같을 수 없다.
- 만약 v가 a만 가지면, y는 a만 가지거나 b만 가지거나 c만 가진다.
- 그러므로 a,b,c중 최대 두개는 늘어나고 하나는 그대로이다.
- 만약 v가 b만 가지면, y는 b만 가지거나 c만 가진다.
- 그러므로 b,c는 가지는 범위에 따라서 늘어나고 a는 그대로이다.
- 만약 v가 c만 가지면, y는 c만 가진다..
- 그러므로 c는 늘어나고 a,b는 그대로이다.
- 그러므로 개수는 모두 같을 수 없다.
- v와 y는 두개 이상의 symbol을 가지고 있다. 다시 말해 a,b,c가 바뀌는 경계선을 가지고 있다.
- s′=uv2xy2z를 가정해 보자.
- v와 y는 두개 이상의 symbol을 가지고 있으므로 패턴에 어긋나게 된다.
- C={aibjck∣0≤i≤j≤k}
- 다음에 대해서 context free가 아니라는 것을 증명하자.
- 이를 위해 C가 Context-Free라고 가정하자.
- C는 pumping lemma를 만족해야한다.
- p는 pumping length이다.
- string s=apbpcp를 선택한다.
- s∈C이며, ∣s∣≤p임이 명백하다.
- s=uvxyz로 나누었을 때 아래 조건을 모두 만족해야 한다.
임의의 s=uvxyz는 다음과 같은 조건을 모두 만족한다.
1. 모든 i≥0에 대해서, s′=uvixyiz∈A
2. ∣vy∣>0
3. ∣vxy∣≤p
-
v와 y는 하나의 symbol만 가지고 있다. v,y는 a,b,c 3개의 symbol중 하나에는 없다.
1.a a쪽에 없는 경우이다. uv0xy0z=uxz는 a의 개수가 동일하지만 b나 c는 a보다 개수가 작아지므로 조건을 만족하지 못한다.
1.b b쪽에 없는 경우이다. 이러면 a나 c는 무조건 나와야 한다. 왜냐하면 ∣v∣와 ∣y∣는 0보다 크기 때문이다.
- a가 나오면 uv2xy2z=uxz을 사용한다. 이는 a의 개수가 b보다 커지므로 조건을 만족하지 못한다.
- c가 나오면 uv0xy0z=uxz을 사용한다. 이는 c의 개수가 b보다 작아지므로 조건을 만족하지 못한다.
1.c c쪽에 없는 경우이다. uv2xy2z는 c의 개수가 동일하지만 a나 b는 c보다 개수가 커지므로 조건을 만족하지 못한다.
-
v와 y는 두개 이상의 symbol을 가지고 있다. 다시 말해 a,b,c가 바뀌는 경계선을 가지고 있다.
- s′=uv2xy2z를 가정해 보자.
- v와 y는 두개 이상의 symbol을 가지고 있으므로 패턴에 어긋나게 된다.
- D={ww∣w∈{0,1}∗}
- 다음에 대해서 context free가 아니라는 것을 증명하자.
- 이를 위해 D가 Context-Free라고 가정하자.
- D는 pumping lemma를 만족해야한다.
- p는 pumping length이다.
- s를 찾는 과정은 굉장히 오래 걸릴 것이다. 어떻게 보면 안된다고 생각할 수도 있다.
- 만약 string s=0p10p1를 선택했다고 본다.(이 경우는 통과하지 못함)
- s∈D이며, ∣s∣≤p임이 명백하다.

- uv0xy0z=uxz는 0p−110p−11이 된다. 이것은 조건에 만족한다.
- uvixyiz는 0p+i−110p+i−11이 된다. 이것은 조건에 만족한다.
- 그러므로 잘못 뽑은 string s=0p10p1는 귀류법을 증명하지 못ㅎ나다.
- string s=0p1p0p1p를 선택한다.
- s∈D이며, ∣s∣≤p임이 명백하다.
- s=uvxyz이고 ∣vxy∣≤p다.
- 이 경우 3가지 과정을 통해 증명할 수 있다.
- vxy는 s의 가운데를 포함해야 한다.
- 만약 s 절반의 앞에 있다고 해보자.
- uv2xy2z는 s 절반의 앞에 숫자들이 추가된다는 의미이다.
- 이 경우 uv2xy2z의 가운데는 앞으로 옮겨간다.
- 그러나 이 경우 가운데가 1의 영역을 침범하므로 w가 앞은 0으로 시작하고 뒤는 1로 시작하게 된다.
- s 절반의 뒤에 있는 경우도 비슷하다.
- 그러므로 vxy는 s의 가운데를 포함해야 한다.
- vxy는 s의 가운데를 포함해야 한다.
- 이 경우 uv0xy0z=uxz는 0p1i0j1p가 된다.
- i=p이거나 j=p이다.
- 그러므로 같은 w가 나올 수 없다.