일반 언어를 튜링 할 수 있습니까?


32

나는 Iota와 Jot 에 대해 읽고 있었고이 섹션이 혼란 스럽다는 것을 알았습니다.

문자열의 구문 트리가 왼쪽 또는 오른쪽으로 분기 될 수있는 Iota와 달리 Jot 구문은 균일하게 왼쪽 분기됩니다. 결과적으로, Iota는 엄격하게 컨텍스트가 없지만 Jot는 일반 언어입니다.

내 이해는 Iota와 Jot이 모두 Turing이라는 것입니다. 그러나 분명히 하나는 맥락이 없으며 다른 하나는 규칙적입니다! 확실히 정규 언어는 튜링을 완료 할 수 없습니까?


3
튜링 머신을 설명하는 언어는 일반 언어로 간단하게 작성할 수 있습니다 (예 : i = {0,1, -1}, b = {입력 끝} (i + bi + bi) + b (i +) 설명). 비어 있지 않은 규칙 세트와 비어 있지 않은 입력. 또는 대답이 언급 한대로 언어 클래스에 대한 별도의 개념 인 통역사가있는 경우와 같이 해석 할 수 있습니다.
큐빅

1
@Cubic : 그 문제에 대해, 튜링 머신은 모든 숫자가 정확히 하나의 머신 (즉, 셀 수 있음)을 나타내도록 번호가 매겨 질 수 있으며, 그 숫자는 단항 표기법으로 표현 될 수 있습니다. 나는이 물건을 제대로 연구하지 않았으므로 정의를 연구해야하지만 1*0정규 언어입니다. ;-) 프로그래머 나 컴파일러 작성자에게 친숙한 프로그래밍 언어는 아니지만.
Steve Jessop

답변:


40

한마디로 대답은 그렇습니다.

그러나 "언어"라는 용어와 완전히 관련이없는 두 가지 의미를 혼합하고 있습니다 (예, 혼란 스럽습니다).

  • 문자열 집합. "컨텍스트 프리 언어"는 "컨텍스트 프리 문법을 사용하여 인식 할 수있는 문자열 세트"를 의미합니다.
  • 계산을 지정하는 방법. "투어 완료 언어"는 "튜링 머신을 지정할 수있는 프로그램을 지정하는 방법"을 의미합니다.

"언어"라는 단어의 두 가지 관련이없는 의미를 사용하여 완전히 관련이없는 두 가지 관점에서 "C ++ 언어"에 대해 이야기 할 수 있습니다.

  • C ++ 문법에 따라 유효한 문자열 집합으로서의 C ++
  • 프로그램을 지정하는 방법으로 C ++.

이 두 가지 관점에서 "C ++ 언어"의 특성은 관련이 없습니다.

이러한 개념을 분리하는 데 도움이되는 추가 예 :

  • 표현 "[az] + @ [az]. [az]"는 유한 오토마타, 즉 정규 언어에 의해 인식 될 수있는 일련의 문자열을 설명한다. 그러나 문자열 집합 : 프로그램을 지정하는 방법이 아닙니다 (각 문자열을 프로그램으로 해석하는 방법을 언급하지 않는 한) 튜링인지 여부에 대해 이야기하는 것은 합리적이지 않습니다. 완전한.
  • 플로우 차트의 언어는 프로그램을 지정하는 방법입니다. 플로우 차트의 특정 특성에 따라 튜링이 완료되거나 완료되지 않을 수 있습니다. 그러나 플로우 차트는 문자열이 아니므로 "문자열 세트로서의 언어"라는 의미에서 플로우 차트에 대해 이야기하는 것은 전혀 의미가 없습니다.

3
나는 그 추가 할 (([a-z][0-9]*)*[A-Z][0-9]*([a-z][0-9]*)*->([a-zA-Z][0-9]*)*)*클래스 0의 모든 언어의 문법을 설명 할 수있는 일반 언어
Erbureth는 분석 재개 모니카 말한다

2
{0,1}

10

Jot의 법률 프로그램 세트는 정기적이지만 Jot 자체는 Turing-complete입니다. 이는 각 계산 가능한 함수가 Jot로 표현 될 수 있음을 의미합니다. 모든 이진 문자열이 합법적 인 언어를 생각해 낼 수는 있지만 언어 자체는 Turing complete (운동)입니다. 구문과 의미가 혼동되고 있습니다.

그건 그렇고, 문맥없는 언어는 다항식 시간 파싱 알고리즘을 가지고 있기 때문에 아마도 NP가 완전하지 않습니다.


9

현대 프로그래밍 언어의 구문 만 (구문 트리로 인코딩 된) 모든 기능과는 거리가 멀다. 실제로 오류없이 컴파일되는 특정 언어의 모든 프로그램 세트에 의해 정의 된 공식 언어는 컨텍스트거의 없습니다 .

정적 및 동적 의미론이 방정식에 영향을 미칩니다. 그것들은 구문 트리에서 보이지 않지만 코드 조각이 실제로 프로그램인지 계산하는 것을 결정합니다. 결론은 문맥이없는 resp입니다. "구문"으로 정의 된 정규 형식 언어 는 프로그래밍 언어를 과대 평가 합니다.

이제 귀하의 질문에 대답하십시오 : 예, 가능합니다. 예를 들어, ö 링 기계의 고델 (Gödel) 번호 매기기 를 고려하십시오 . TM을 나타내는 모든 자연수의 "프로그래밍 언어"를 얻습니다. 물론 프로그래밍하기에는 좋은 언어는 아니지만, 튜링 완성 언어는 규칙적이고 사소한 언어입니다.


3
  1. 프로그래밍 언어는 Turing 머신이 계산할 수있는 모든 기능을 지정할 수있을 정도로 표현력이 충분하다면 Turing-complete 입니다. 여기에 우리가 논의하고 지정된 언어의 힘 프로그래밍 언어를 . 예를 들어 Python으로 Turing 머신에 대한 인터프리터를 작성하는 것은 어렵지 않으므로 Python은 Turing-complete 프로그래밍 언어입니다.

  2. 프로그래밍 언어의 구문 , 즉 프로그래밍 언어의 유효한 프로그램에 해당하는 문자열 세트 자체는 언어입니다. 예를 들어 가능한 모든 Python 프로그램 세트를 고려하십시오. 프로그래밍 언어의 구문이 될 수 있습니다 상황에 맞는 , 문맥 자유 , 정기적으로 우리는 주어진 문자열이 프로그래밍 언어에 유효한 프로그램 (이것은 컴파일러 / 통역에 의해 수행되는) 것을 확인의 어려움에 관심이 등. 프로그래밍 언어의 구문에 컨텍스트가 없다고 말하면 구문에 컨텍스트가없는 문법이 있으며 프로그램의 유효성을 검사하기위한 푸시 다운 오토마타가 있음을 의미합니다.

프로그래밍 언어의 구문의 단순성이 해당 프로그래밍 언어로 지정된 프로그램의 계산 능력에 대한 제한을 의미하지는 않습니다.


1

대답은 '예'입니다. 허용되는 답변 상태에서 문법은 그 의미와 무관합니다. Chomsky 자신의 말로 :

문법이 자율적이고 의미와 무관하다는 결론을 내릴 수밖에 없습니다 ...

촘스키, 구문 구조 (1956)

문법이 계산할 수있는 모든 것을 설명하기에 충분한 문장을 생성 할 수 있다면 계산할 수있는 각 문장마다 하나씩 계산 의미를 문장에 할당 할 수 있습니다.

실제적인 구체적인 예에서, 인기있는 언어 whitespace는 규칙적인 문법을 가지고 있으며 아마도 x86 assembly languages검증이 필요합니다.


나는 구절이 Go의 문법이 공식적인 의미에서 정규 언어라는 것을 의미하지는 않는다. 나는 그것이 문법이 불규칙하지 않다는 것을 의미한다고 생각합니다 . Go의 구문이 실제로 Chomsky 계층 구조에서 정규 언어 인 경우 균형 잡힌 중첩 괄호를 생성 할 수 없습니다.
tsleyson

예, Go의 문법에는 재귀가 있습니다. 소식 업데이트 중
Eric
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.