정규 언어는 무엇입니까?


80

나는 언어 수준의 개념을 이해하려고 노력하고 있습니다 (일반, 문맥 자유, 문맥 감지 등).

나는 이것을 쉽게 찾을 수 있지만 내가 찾은 모든 설명은 많은 기호와 세트 에 대해 이야기 합니다 . 두 가지 질문이 있습니다.

  1. 일반 언어가 무엇이며 언어가 어떻게 다른지 말로 설명 할 수 있습니까?

  2. 사람들은이 물건을 이해하는 법을 어디서 배우나요? 내가 알기로는 공식 수학인가? 나는 그것을 사용하는 uni에서 두 개의 코스를 가졌고 튜터가 우리가 그것을 알고 있다고 생각했기 때문에 거의 아무도 그것을 이해하지 못했습니다. 어디서 배울 수 있으며 사람들이 많은 출처에서 그것을 알 것으로 "기대"하는 이유는 무엇입니까? 교육에 격차가있는 것 같습니다.

예를 들면 다음과 같습니다 .

이 세트에 속하는 모든 언어는 알파벳에 대한 일반 언어입니다.

언어가 어떻게 "위에"있을 수 있습니까?


사실, 위키피디아는이 모든 것을 설명하는 일이 그리 나쁘지 않습니다. 당신은 시작 할 수 있습니다 en.wikipedia.org/wiki/Formal_language 다음 주제를 통해 당신의 방법을 작동합니다. 이것은 예를 들어 "이론적 인 컴퓨터 과학"과정에서 나올 것입니다.
Bart

4
나는 이와 같은 질문이 주제에 관한 것이라고 말하고 싶습니다. 컴퓨터 과학에 대해 논의 할 수있는 곳을 참조하십시오 . 메타에.
hammar

답변:


157

컴퓨터 과학의 맥락에서 단어기호를 연결 한 것 입니다 . 사용되는 기호를 알파벳 이라고합니다 . 예를 들어, 알파벳 밖으로 형성 일부 단어는 {0,1,2,3,4,5,6,7,8,9}1, 2, 12, 543, 1000,와 002.

언어는 모든 가능한 단어의 하위 집합입니다. 예를 들어 모든 엘리트 MI6 에이전트를 캡처하는 언어를 정의 할 수 있습니다. 두 번 0로 시작하는 모든 사람들, 언어의 단어가 될 수 있도록 007, 001, 005,과 0012, 그러나 0715. 간단하게하기 위해 우리는 언어가 " 알파벳에서 기호 연결하여 형성된 단어의 하위 집합"대신 "알파벳 위에 "있다고 말합니다 .

컴퓨터 과학에서 우리는 이제 언어를 분류하려고합니다. 단어의 모든 기호를 차례로 검사하여 알고리즘 / 일정 (유한) 메모리를 가진 기계를 사용하는 언어에 단어가 있는지 확인할 수있는 경우 언어를 정규화 라고합니다 . 단어만으로 구성된 언어 42는 규칙적입니다. 임의의 메모리를 요구하지 않고도 단어가 포함되어 있는지 여부를 결정할 수 있기 때문입니다. 첫 번째 기호가 4인지, 두 번째 기호가 2인지, 더 많은 숫자가 뒤에 오는지 확인하기 만하면됩니다.

유한 한 수의 단어를 가진 모든 언어는 규칙적입니다. 왜냐하면 우리는 (이론적으로) 일정한 크기의 제어 흐름 트리를 구축 할 수 있기 때문 if입니다. 예를 들어, 다음 구문을 사용하여 단어가 "10에서 99 사이의 프라임 숫자"언어로되어 있는지 테스트 할 수 있습니다. 현재 우리가있는 코드 라인에서 인코딩 할 메모리 외에는 메모리가 필요하지 않습니다.

if word[0] == 1:
  if word[1] == 1: # 11
      return true # "accept" word, i.e. it's in the language
  if word[1] == 3: # 13
      return true
...
return false

모든 유한 언어는 일반 언어이지만 모든 일반 언어가 유한 한 것은 아닙니다. 우리 이중 0 언어 단어 무한한 포함 ( 007, 008물론 004242하고 0012345), 그러나 일정 메모리를 테스트 할 수있다 : 시험에 단어가에 속하는지를, 상기 제 기호는 체크 여부 0번째 심볼이며 여부 0. 그럴 경우 수락하십시오. 단어가 3보다 짧거나로 시작하지 00않는 경우 MI6 코드 이름이 아닙니다.

공식적으로 유한 상태 기계 또는 정규 문법의 구성 은 언어가 규칙적임을 증명하는 데 사용됩니다. if위 의- 문과 유사 하지만 임의의 긴 단어를 허용합니다. 유한 상태 머신이있는 경우 정규 문법도 있고 그 반대도 마찬가지이므로 둘 중 하나를 표시하는 것으로 충분합니다. 예를 들어 double-0 언어에 대한 유한 상태 머신은 다음과 같습니다.

start state:  if input = 0 then goto state 2
start state:  if input = 1 then fail
start state:  if input = 2 then fail
...
state 2: if input = 0 then accept
state 2: if input != 0 then fail
accept: for any input, accept

동등한 정규 문법은 다음과 같습니다.

start → 0 B
B → 0 accept
accept → 0 accept
accept → 1 accept
...

동등한 정규식 은 다음 과 같습니다 .

00[0-9]*

일부 언어는 규칙적 이지 않습니다 . 예를 들어, 임의의 수의 언어 1와 동일한 수의 언어 2(종종 임의의 n에 대해 1 n 2 n 로 기록됨 )는 규칙적이지 않습니다. 일정한 양의 메모리 (= 일정한 수의 상태 ) 는 단어가 언어에 있는지 여부를 결정하기 위해 s 수를 저장합니다 .1

이것은 일반적으로 이론적 인 컴퓨터 과학 과정에서 설명되어야합니다. 운 좋게도 위키피디아는 공식 언어정규 언어를 아주 멋지게 설명합니다 .


감사합니다. 비정규 언어에 대한 마지막 부분을 제외하고 모두 이해했습니다. 1의 수를 저장하려면 메모리가 필요하지만 MI6 예제에서는 처음 두 문자가 0이라는 것을 기억할 메모리가 필요하지 않습니까?
FBryant87 2011

2
@ user666254 일정한 양의 메모리는 상태로 인코딩 될 수 있으므로 항상 허용됩니다. 문제는 n 이 무한대에 가까워 질 때 1 ^ n2 ^ n을 테스트하기 위해 일정한 양의 메모리가 필요하다는 것 입니다. 공식적으로, 당신은 보통 언어가 규칙적이지 않다는 것을 보여주기 위해 일반적인 언어대해 펌핑 기본형을 사용합니다 .
phihag 2011-07-16

1
좀 더 구체적으로 말하면 문자열이 1n2n 언어인지 여부를 결정하려면 3n + 1 상태가 필요합니다.
laike9m

4
나는 개인적으로 위키피디아가 수학적 표기법을 공부하지 않은 경우 정규 언어를 설명하는 데만 능숙하다고 생각하지 않습니다. 그들은 기호와 변수 중 일부를 설명 할 때에도 몇 가지 추가 사항을 추가하고 설명하지 않습니다. 이 기사는 필요하지 않은 사람들에게는 더 읽기 쉬울 수 있지만 나머지 우리에게는 설명이 필요합니다.
Andrew S

1
@ P.Soutzikevich 아니요, 같은 방식으로 저울을 사용하여 차량이 자동차 또는 트럭 (> 12 톤)으로 간주되는지 여부를 결정할 수 있지만 저울은 자동차를 정의하지 않습니다. 언어가 규칙적이지 않다는 것을 증명하는 다른 방법이 많이 있습니다 . 일반 언어의 펌핑 기본형이 일반 언어의 정의와 매우 밀접하게 관련되어 있다는 점에서 정확합니다. 정규 언어를 정의 하지 않습니다 .
phihag

5

다음은 Wikipedia 의 동등한 정의 중 일부입니다 .

[...] 정규 언어는 다음과 같은 등가 속성을 충족하는 형식 언어 (즉, 유한 알파벳에서 무한한 기호 시퀀스 집합)입니다.

  • 결정 론적 유한 상태 기계에서 받아 들일 수 있습니다.
  • 비 결정적 유한 상태 머신에서 허용 할 수 있습니다.
  • 공식적인 정규 표현식으로 설명 할 수 있습니다.

    많은 프로그래밍 언어와 함께 제공되는 "정규식"기능은 정규식이 아닌 언어를 인식 할 수 있도록하는 기능으로 확장되어 정규식과 엄격하게 동일하지 않습니다.

가장 먼저 주목해야 할 것은 일반 언어는 몇 가지 제한 사항 이 있는 공식 언어 라는 것입니다. 형식적 언어는 본질적으로 문자열의 (무한한) 모음입니다. 예를 들어, 공식 언어 Java는 가능한 모든 텍스트 파일 모음의 하위 집합 인 모든 가능한 Java 파일 모음입니다.

가장 중요한 특징 중 하나는 문맥없는 언어 와 달리 일반 언어는 임의의 중첩 / 재귀를 지원하지 않지만 임의의 반복이 있다는 것입니다.

언어에는 항상 허용되는 기호 집합 인 기본 알파벳이 있습니다. 예를 들어, 프로그래밍 언어의 알파벳은 일반적으로 ASCII 또는 유니 코드이지만 공식 언어 이론에서는 허용되는 문자 만 01.

우리 대학에서는 컴파일러 수업에서 공식 언어 이론을 배웠지 만 학교마다 다를 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.