검색 여닫기
검색
메뉴 여닫기
555
262
4
6.2천
noriwiki
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
특수 문서 목록
파일 올리기
환경 설정 메뉴 여닫기
notifications
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
user-interface-preferences
한국어
개인 도구
로그인
Chomsky Normal Form 문서 원본 보기
noriwiki
문서 공유하기
다른 명령
←
Chomsky Normal Form
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게 제한됩니다:
사용자
.
문서의 원본을 보거나 복사할 수 있습니다.
[[분류:계산 이론 개론]] [[분류:컴퓨터 공학]] 상위 문서: [[Grammars#Context-Free Languages#Chomsky Normal Form|Context-Free Languages]] ==개요== CNF(Chomsky Normal Form)는 CFG를 더욱 간단하고 증명하기 쉽게 바꾼 표준 형식이다. 모든 CFG는 CNF와 동등한 문법으로 바뀔 수 있으며, CFG가 다음 세 가지의 규칙만 가지면 CNF에 해당한다: # <math>A \rightarrow BC</math><ref>이때 B, C는 시작 기호 S가 아니다</ref> # <math>A \rightarrow a</math> # <math>S \rightarrow \epsilon</math> CFG를 CNF로 바꾸더라도 새로운 문자열이 생성되지는 않으며, 모든 grammar와 문자열이 그대로 보존된다. ==CFG to CNF== 아래와 같이 CFG가 주어졌다고 가정하자: <math>S \rightarrow ASA | aB</math> <math>A \rightarrow B | S</math> <math>B \rightarrow b | \epsilon</math> ===Step 1=== CNF에서는 시작기호가 우변에 등장하면 안 되므로, 기존 시작기호 <math>S</math>를 포함하는 새 시작기호 <math>S_0</math>를 만든다. 이를 통해 모든 변환은 <math>S_0</math>에서 시작한다. 이를 통해 아래와 같은 식을 추가한다: <math>S_0 \rightarrow S</math> ===Step 2=== 주어진 식에 <math>B \rightarrow \epsilon</math>이 존재하므로 제거해야 한다. 이를 위해서 <math>B\rightarrow \epsilon</math> 규칙을 제거하고, <math>B</math>를 포함하는 식이 유도되는 모든 규칙에서, <math>B</math>를 <math>\epsilon</math>으로 치환한 아래의 식을 추가한다: <math>S \rightarrow aB \rightarrow a</math> <math>A \rightarrow B \rightarrow \epsilon</math> 위와 같은 과정을 <math>A \rightarrow \epsilon</math> 규칙에 대해서도 동일하게 적용해야 한다. 이를 위해 해당 식을 제거하고, 아래의 식들을 추가한다: <math>S \rightarrow S</math> <math>S \rightarrow AS</math> <math>S \rightarrow SA</math> 또한, <math>A \rightarrow S, A \rightarrow B, S \rightarrow</math>와 같은 규칙 대신, 해당 변수들이 만들어낼 수 있는 규칙으로 대체해야 한다. 따라서 이를 일괄적으로 적용하면 아래와 같은 결과가 된다: <math>S \rightarrow ASA|SA|AS|aB|a</math> <math>B \rightarrow b</math> <math>S_0 \rightarrow ASA|SA|AS|aB|a</math> <ref><math>S_0 \rightarrow S</math> 규칙을 삭제하며 추가</ref> <math>A \rightarrow ASA|SA|AS|aB|a</math> <ref><math>A \rightarrow S</math> 규칙을 삭제하며 추가</ref> <math>A \rightarrow b</math> <ref><math>A \rightarrow B</math> 규칙을 삭제하며 추가</ref> ===Step 3=== 이제, CNF에서는 규칙의 오른쪽에 두개의 비단말만 가능하므로 3개 변수인 <math>ASA</math> 형태를 분해해야 한다. 이를 위해 해당 규칙을 아래와 같이 중간 비단말 <math>S_1, A_1</math>을 활용한 규칙들로 대체해야 한다.<ref>S_1, A_1과 같이 굳이 변수를 두개 추가하는 이유는 S에서 파생된 규칙과 A에서 파생된 규칙을 구분하기 위해서이다.</ref>: <math>S \rightarrow AS_1</math> <math>S_1 \rightarrow SA</math> <math>A \rightarrow AA_1</math> <math>A_1 \rightarrow SA</math> 또한, CNF에서는 단말이 반드시 단독으로만 나와야 하므로, <math>S \rightarrow aB</math>와 같은 규칙은 허용되지 않는다. 따라서 해당 규칙을 아래와 같이 중간 비단말 <math>A_2</math>을 활용한 규칙들로 대체해야 한다: <math>A_2 \rightarrow a</math> <math>S \rightarrow A_2B</math> 따라서 아래와 같이 최종적인 CNF가 도출된다: <math>S \rightarrow AS_1|SA|AS|A_2B|a</math> <math>B \rightarrow b</math> <math>S_0 \rightarrow AS_1|SA|AS|A_2B|a</math> <math>A \rightarrow AA_1|SA|AS|A_2B|a</math> <math>A \rightarrow b</math> <math>A_2 \rightarrow a</math>
Chomsky Normal Form
문서로 돌아갑니다.