Chomsky Normal Form

youngwiki
Pinkgo (토론 | 기여)님의 2025년 10월 26일 (일) 01:42 판 (새 문서: 분류:계산 이론 개론 분류:컴퓨터 공학 상위 문서: Context-Free Languages ==개요== CNF(Chomsky Normal Form)는 CFG를 더욱 간단하고 증명하기 쉽게 바꾼 표준 형식이다. 모든 CFG는 CNF와 동등한 문법으로 바뀔 수 있으며, CFG가 다음 세 가지의 규칙만 가지면 CNF에 해당한다: # <math>A \rightarrow BC</math><ref>이때 B, C는 시작 기호 S가 아니다...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

상위 문서: Context-Free Languages

개요

CNF(Chomsky Normal Form)는 CFG를 더욱 간단하고 증명하기 쉽게 바꾼 표준 형식이다. 모든 CFG는 CNF와 동등한 문법으로 바뀔 수 있으며, CFG가 다음 세 가지의 규칙만 가지면 CNF에 해당한다:

  1. A→BC[1]
  2. A→a
  3. S→ϵ

CFG를 CNF로 바꾸더라도 새로운 문자열이 생성되지는 않으며, 모든 grammar와 문자열이 그대로 보존된다.

CFG to CNF

아래와 같이 CFG가 주어졌다고 가정하자:

S→ASA|aB
A→B|S
B→b|ϵ

Step 1

CNF에서는 시작기호가 우변에 등장하면 안 되므로, 기존 시작기호 S를 포함하는 새 시작기호 S0를 만든다. 이를 통해 모든 변환은 S0에서 시작한다. 이를 통해 아래와 같은 식을 추가한다:

S0→S

Step 2

주어진 식에 B→ϵ이 존재하므로 제거해야 한다. 이를 위해서 B→ϵ 규칙을 제거하고, B를 포함하는 식이 유도되는 모든 규칙에서, B를 ϵ으로 치환한 아래의 식을 추가한다:

S→aB→a
A→B→ϵ

위와 같은 과정을 A→ϵ 규칙에 대해서도 동일하게 적용해야 한다. 이를 위해 해당 식을 제거하고, 아래의 식들을 추가한다:

S→S
S→AS
S→SA

또한, A→S,A→B,S→와 같은 규칙 대신, 해당 변수들이 만들어낼 수 있는 규칙으로 대체해야 한다. 따라서 이를 일괄적으로 적용하면 아래와 같은 결과가 된다:

S→ASA|SA|AS|aB|a
B→b
S0→ASA|SA|AS|aB|a [2]
A→ASA|SA|AS|aB|a [3]
A→b [4]

Step 3

이제, CNF에서는 규칙의 오른쪽에 두개의 비단말만 가능하므로 3개 변수인 ASA 형태를 분해해야 한다. 이를 위해 해당 규칙을 아래와 같이 중간 비단말 S1,A1을 활용한 규칙들로 대체해야 한다.[5]:

S→AS1
S1→SA
A→AA1
A1→SA

또한, CNF에서는 단말이 반드시 단독으로만 나와야 하므로, S→aB와 같은 규칙은 허용되지 않는다. 따라서 해당 규칙을 아래와 같이 중간 비단말 A2을 활용한 규칙들로 대체해야 한다:

A2→a
S→A2B

따라서 아래와 같이 최종적인 CNF가 도출된다:

S→AS1|SA|AS|A2B|a
B→b
S0→AS1|SA|AS|A2B|a
A→AA1|SA|AS|A2B|a 
A→b 
A2→a
  1. ↑ 이때 B, C는 시작 기호 S가 아니다
  2. ↑ S0→S 규칙을 삭제하며 추가
  3. ↑ A→S 규칙을 삭제하며 추가
  4. ↑ A→B 규칙을 삭제하며 추가
  5. ↑ S_1, A_1과 같이 굳이 변수를 두개 추가하는 이유는 S에서 파생된 규칙과 A에서 파생된 규칙을 구분하기 위해서이다.