언어 튜링을 완성시키는 이유는 무엇입니까?


79

튜링을 완성하게 만드는 언어 기능 / 구조의 최소 세트는 무엇입니까?


21
그냥 구글하는 것이 낫지 않습니까? en.wikipedia.org/wiki/Turing_completeness
aml90

2
안녕하세요 호기심 많은 고양이, 프로그래머에 오신 것을 환영합니다! 목록에 대한 전화는 여기서 주제가 아닙니다 : 귀하의 질문에서 해당 부분을 제거했습니다. 즉,이 퀘스트는 매우 광범위합니다. Turing-completeness에 대해 생각하고있는 특정 문제가 있습니까?

3
@amalantony : 각주로 .
Bobby

컴퓨터 과학의 관점은 여기를 참조 하십시오 .
Raphael

답변:


73

튜링 소위 늪 (tarpit)는 튜링 완성 할 수 가능한 한 적은 수의 요소를 사용하는 동안 노력하고 난해한 프로그래밍 언어의 일종이다. Brainfuck 은 아마도 가장 잘 알려진 타르 핏 일지 모르지만 많은 것이 있습니다.

  • IotaJotSK (I) 결합기 계산법 에 따라 각각 2 개와 3 개의 기호가있는 기능 언어입니다 .

  • OISC ( One Instruction Set Computer )는 하나 이상의 인수에 대한 명령이 하나만 필요한 명령형 계산 유형을 나타냅니다. 일반적으로 "0보다 작거나 같은 경우 빼기 및 분기"또는 "빌리면 빼기 및 건너 뛰기"입니다. x86 MMU 는 이전 명령을 구현하므로 Turing-complete입니다.

일반적으로 명령형 언어가 Turing-complete가 되려면 다음이 필요합니다.

  1. 조건부 반복 또는 조건부 점프의 형식 (예 : while, if+ goto)

  2. 어떤 형태의 스토리지 (예 : 변수, 테이프)를 읽고 쓰는 방법

A의 람다 계산법은 TC를 할 함수형 언어 기반, 그것은 필요합니다 :

  1. 인수에 대한 함수를 추상화하는 기능 (예 : 람다 추상화, 인용)

  2. 인수에 함수를 적용하는 기능 (예 : 축소)

물론 다른 계산 방법도 있지만 Turing tarpits의 일반적인 모델입니다. 실제 컴퓨터가 유의 하지 보편 튜링 기계 가 무제한의 스토리지를 필요가 없기 때문에. 엄밀히 말하면“바운드 스토리지 시스템”입니다. 메모리를 계속 추가해야한다면 튜링 머신에 전원을 공급할 것입니다. 그러나 바운드 스토리지 시스템과 유한 상태 시스템 도 계산에 유용합니다. 그것들은 단순히 보편적 이지 않다 .

엄밀히 말하면, Turing-completeness에는 I / O가 필요하지 않습니다. TC는 언어가 원하는 기능을 계산할 수 있다고 주장하지만 결과를 보여줄 없습니다 . 실제로, 모든 유용한 언어는 어떻게 든 세상과 상호 작용하는 방법을 가지고 있습니다.


명령형 언어의 경우 간단한 변수로 충분합니까? 어떤 종류의 컬렉션 (예 : 배열 또는 링크 된 목록)이 필요할 것이라는 인상을 받았습니다.
luiscubal

1
@ luiscubal은 임의의 양의 데이터를 지정할 수 있어야합니다. 간단한 변수를 사용하면 변수 자체에있는 데이터 양을 나타낼 수 있습니다. N + 1 개의 서로 다른 데이터 조각을 나타내려면 어떻게해야합니까? Fractran과 같은 트릭 으로 간단한 변수조차도 할 수 있다고 주장 할 수는 있지만 그것은 당신이 요구하는 것이 아닙니다.

언어가 ENDLESS 루프 를 지원해야 합니까?
sergiol

"모든 유용한 언어는 세상과 상호 작용하는 방법이 있습니다." Algol 60은 세상과 소통 하는 정의 된 방법 이 없었 습니다. Algol 60 프로그램의 모든 I / O는 라이브러리 함수를 호출하여 수행되었으며 라이브러리 기능은 구현에 따라 완전히 다를 수 있습니다. 그러나 나는 Algol 60이 "유용한 지"여부에 대한 논의에서 스스로를 비난합니다.
Solomon Slow

15

보다 실용적인 관점에서 : Turing-complete 언어의 모든 프로그램을 귀하의 언어로 번역 할 수 있다면, 귀하의 언어는 Turing-complete 여야합니다. 따라서 디자인 한 언어가 Turing-complete인지 확인하려면 YourLanguage 컴파일러에 Brainf ***를 작성하고 모든 합법적 인 BF 프로그램을 컴파일 할 수 있음을 증명 / 시연 할 수 있습니다.

명확히하기 위해, YourLanguage의 인터프리터 외에도 BF 프로그램을 YourLanguage로 컴파일 할 수있는 컴파일러 (모든 언어로)를 작성합니다 (물론 동일한 의미를 유지함).


11
그렇습니다. 접근하는 가장 실용적인 방법 일 것입니다. </sarcasm>
Robert Harvey

13
@RobertHarvey는 요점이 있지만 일반적인 아이디어는 매우 중요합니다. Brainfuck은 프로그래밍 언어 가 진행됨에 따라 완전히 완성되고 매우 간단합니다. 난해하지 않은 프로그래밍 언어의 경우 어리석은 증거를 제공하는 것보다 brainfuck 인터프리터를 구현하는 것이 훨씬 쉽고 빠를 수 있습니다. 파이썬이 완전히 튀었다는 증거); 그리고 수십 가지의 난해한 브레인 섹스에서 영감을 얻은 언어는 브레인 씨발에 매핑되는 방식으로 알려져 있기 때문에 완전히 완성 된 것으로 알려져 있습니다.

7
@RobertHarvey : 왜 안돼? 분명히 자신의 언어를 디자인하는 사람은 BF 컴파일러를 작성할 수 있습니다 (필요한 경우 다른 언어를 찾으십시오).
Anton Golov

5
@delnan : 당신은 것입니다 당신의 BF 인터프리터가 올바르게 BF 사양을 구현하고 있다는 점을 증명해야 IOW 당신은 당신의 BF 인터프리터가, 사실, BF와 같은 언어에 대한 BF 통역 아닌 통역 것을 증명해야 것 Turing-complete 일 수도 있고 아닐 수도 있습니다.
Jörg W Mittag

2
@ DarekNędza, 그것은 Turing Completeness가 정의되는 방식의 자연스러운 결과입니다. Turing Complete 언어의 확장은 여전히 ​​Turing Complete입니다.
Anton Golov

8

시스템이 범용 Turing 기계로 할 수있는 작업을 수행 할 수있는 경우에만 Turing 완료 상태로 간주 될 수 있습니다. 범용 튜링 기계는 주어진 시간에 계산 가능한 기능을 해결할 수 있다고 말했기 때문에 튜링 전체 시스템은 확장 적으로도 그렇게 할 수 있습니다.

Turing이 완전한지 확인하려면 내부에 Turing 기계를 구현할 수 있는지 확인하십시오. 즉, 다음을 시뮬레이션 할 수 있는지 확인하십시오.

  1. "변수"(또는 임의의 데이터)를 읽고 쓸 수있는 능력 : 거의 자명하다.
  2. 읽기 / 쓰기 헤드 이동을 시뮬레이션하는 기능 : 변수를 검색하고 저장할 수있는 것만으로는 충분하지 않습니다. 다른 변수를 참조하기 위해 테이프 헤드를 이동하는 기능을 시뮬레이션 할 수도 있어야합니다. 이것은 종종 배열 데이터 구조 (또는 이와 동등한)를 사용하거나 기계 코드와 같은 특정 언어의 경우 "포인터"(또는 동등한)를 사용하여 다른 변수를 참조하는 기능을 사용하여 프로그래밍 언어 내에서 시뮬레이션 할 수 있습니다.
  3. 유한 상태 머신을 시뮬레이션하는 기능 : 자주 언급되지는 않지만 튜링 머신은 실제로 AI 개발에서 자주 사용되는 유한 상태 머신의 변형입니다. Alan Turing은 국가의 목적은 개인의 "다양한 문제 해결 모드"를 시뮬레이션하는 것이라고 말했다.
  4. "정지 된"상태 : 종종 튜링 완료로 간주하기 위해 규칙 세트를 반복 할 수 있어야한다고 언급하지만, 알고리즘이 상태 알고리즘에 대한 공식적인 정의가 항상 이루어져야하기 때문에 이는 실제로 좋은 기준은 아닙니다. 결국 결론. 그들이 어떤 방식으로 결론을 내릴 수 없다면, Turing이 완료되지 않았거나 알고리즘이 계산 가능한 기능이 아니라는 것입니다. 게임 콘솔과 같이 작동 방식으로 인해 기술적으로 결론을 내릴 수없는 완벽한 시스템은 어떤 방식으로 정지 상태를 "시뮬레이션"하여이 한계를 극복합니다. 이를 증명할 수없는 결정적인 기능인 "정지 문제"와 혼동하지 마십시오.

튜링이 완료된 것으로 간주되는 시스템의 실제 최소 요구 사항입니다. 더 이상 아무것도 없습니다. 어떤 방식 으로든 이들 중 어느 것도 시뮬레이션 할 수 없다면 튜링이 완료되지 않은 것입니다. 다른 사람들이 제안한 방법은 그러한 기능을 갖지 않는 여러 Turing complete 시스템이 있기 때문에 단지 끝을 의미합니다.

실제로 진정한 Turing complete 시스템을 구축 할 수있는 알려진 방법은 없습니다. 물리적 공간 내에서 튜링 머신 테이프의 무한 성을 실제로 시뮬레이션 할 수있는 알려진 방법이 없기 때문입니다.


4

프로그래밍 언어를 사용하여 프로그래밍을 수행 할 수 있으면 프로그래밍 언어가 작동합니다. 언어 튜링을 완료하는 기능 세트가 하나도 없으므로 루프가 필요하거나 튜링이 완료 되지 않은 언어가 있기 때문에 변수가 필요하다는 답변이 잘못 되었습니다.

Alan Turing은 유니버설 튜링 머신을 만들었으며 유니버설 머신에서 작동하도록 설계된 프로그램을 귀하의 언어로 실행하도록 번역 할 수 있다면 Turing도 완료되었습니다. 이것은 또한 간접적으로 작동하므로 모든 범용 튜링 기계 프로그램을 Y 프로그램으로 변환 할 수 있기 때문에 완전한 언어 Y를 튜링하기위한 모든 프로그램을 X로 변환 할 수 있으면 언어 X가 튜링 완료라고 말할 수 있습니다.

시간 복잡성, 공간 복잡성, 쉬운 입 / 출력 형식 및 모든 프로그램 작성 용이성은 방정식에 포함되어 있지 않으므로 이러한 기계는 전력 손실로 인해 계산이 중단되거나 지구가 태양에 의해 삼키지 않으면 이론적으로 모든 계산을 수행 할 수 있습니다.

일반적으로 튜링 완성도를 입증하기 위해 튜링 완료 언어로 판명 된 통역사가 있지만, 제대로 작동하려면 입력 및 출력 수단이 필요합니다. 언어가 튜링 완료에 실제로 필요하지 않은 두 가지가 있습니다. 프로그램이 시작시 상태를 변경하고 프로그램이 중지 된 후 메모리를 검사 할 수 있으면 충분합니다.

성공적인 언어를 만들기 위해서는 튜링 완전성 이상이 필요하며 타르타르 타르트에도 마찬가지입니다. BrainFuck,and 없이는 인기를 얻지 못했다고 생각 .합니다.


2
"프로그래밍 언어로 계산을 수행 할 수 있다면 프로그래밍 언어가 완전히 작동하지 않습니다." 그것이 언어 튜링을 완성하게 만드는 것이 아니라 교회 튜링 논문입니다.
Rhymoid

@Rhymoid 통역사를 만들 수 없다면 튜링이 완성되지 않았습니까? 즉. 람다 미적분학이 동등하게 튜링 되더라도 완전히 튜링되지 않습니까?
Sylwester

1
저는 여전히 Turing-equivalent 및 Turing-complete (및 Turing-powerful)라는 용어에 대한 권위있는 정의를 찾고 있습니다. 나는 게시판에있는 사람들부터 자신의 프리 지 논문에있는 연구원들까지이 용어들을 다르게 해석하는 너무 많은 사례들을 이미 보았다.
Rhymoid

어쨌든 'Turing-complete'는 Universal Turing Machine (UTM과 동등한 시뮬레이션으로 해석됩니다 .UTM은 모든 Turing 기계를 시뮬레이션 할 수 있으므로 '유니버설')입니다. 1936 년 Turing의 논문에서 자신의 기계를 소개하면서 UTM의 개념을 정의하고 UTM이 교회의 람다 미적분학과 동등한 시뮬레이션이라는 증거를 스케치했습니다. 그렇게함으로써 그는 동일한 계산 능력을 가지고 있음을 증명했습니다. Church-Turing 논문은 간단히 말해서 "그것이 얻을 수있는 모든 계산 능력"이라고 간단히 말하고 있습니다.
Rhymoid

Wikipedia의 Turing completeness 페이지에 대한 두 가지 공식적인 정의가 있습니다. 하나는 I / O가 필요하고 다른 하나는 필요하지 않습니다. 기계가 모든 Turing 계산 기능을 계산할 수 있다면 Turing이 완료되었다고 말하는 것은 아닙니다. 람다 미적분학을 튜링 기계 프로그램과 동일하게 계산하는 람다 미적분학에서 동등한 프로그램을 쉽게 만들 수 있기 때문에 람다 미적분을 튜링 완료 상태로 되돌릴 수 있습니다.
Sylwester

4

무한 반복 또는 중지 여부를 알 수 없습니다.

-------------

설명 : 입력이 주어지면 모든 경우에 (다른 튜링 머신을 사용하여) 실행하지 않는 한 무한 반복되거나 결국 멈출 지 여부를 알 수는 없습니다 (정지되면 응답하지 않습니다) 반복된다면!).

이것은 잠재적으로 무제한의 양의 데이터를 어떤 방식 으로든 저장할 수 있어야 함을 의미합니다. 아무리 복잡하더라도 무한 테이프와 동등한 값이 있어야합니다! (그렇지 않으면 유한 한 수의 상태 만있을 수 있으며, 이전에 해당 상태를 겪었는지 확인한 후 결국 중지 할 수 있습니다). 일반적으로 튜링 기계는 제어 가능한 수단으로 상태의 크기를 늘리거나 줄일 수 있습니다.

튜링의 원래 범용 튜링 기계에는 해결할 수없는 정지 문제가 있으므로, 자신의 튜링 전체 기계에도 해결할 수없는 정지 문제가 있어야합니다.

Turing complete 시스템은 다른 Turing complete 시스템을 에뮬레이션 할 수 있으므로 시스템에 잘 알려진 Turing complete 시스템에 대한 에뮬레이터를 구축 할 수 있으면 시스템도 Turing 완료된 것입니다.

예를 들어, 무한 반복 격자 패턴이있는 보드 (상단과 왼쪽에 다른 버전이 있음)가 제공되면 Snakes & Ladders가 튜링이 완료되었음을 증명한다고 가정하십시오. 2 카운터 Minsky 기계가 Turing complete (2 개의 무제한 카운터와 유한 숫자 중 1 개의 상태를 가짐)를 알면 그리드의 X 및 Y 위치가 2 카운터의 현재 값인 동등한 보드를 구성 할 수 있습니다 현재 경로는 현재 상태입니다. 쾅! Snakes & Ladders가 튜링 완료되었음을 증명했습니다.


1
나는 그 주장을 사지 않습니다. 정지 문제가 Turing 기계에 대해 결정될 수 없다고해서 정지 문제를 결정할 수없는 프로그램을 지정할 수있는 모든 표기법이 Turing 완료임을 직접적으로 암시하지는 않습니다. 그 반대의 경우에만 분명히 맞습니다. 표기법이 튜링이 완료되면 정지 문제를 결정할 수없는 프로그램을 작성할 수 있습니다.
5gon12eder

필요한 조건입니다. 모든 프로그램에 대해 중단 여부를 결정할 수 있으면 언어가 튜링 완료되지 않은 것입니다.
gnasher729

4

필요한 조건 중 하나는 반복 이전에 결정되지 않은 최대 반복 횟수 또는 최대 재귀 깊이가 사전에 결정되지 않은 재귀 인 루프입니다. 예를 들어, for ... in ... 루프는 많은 최신 언어로 언어 튜링을 완료하기에 충분 하지 않지만 다른 방법을 사용한다는 것을 알았습니다. 이는 반복 횟수 제한이나 재귀 깊이 제한이 아니라 최대 반복 횟수와 재귀 깊이를 미리 계산해야합니다.

예를 들어 Ackermann 함수는 이러한 기능이없는 언어로 계산 될 수 없습니다. 반면에 이러한 기능을 요구하지 않고도 매우 복잡하고 유용한 소프트웨어를 많이 작성할 수 있습니다.

반면에, 모든 반복 수와 미리 계산 된 모든 재귀 깊이 만이 프로그램이 중단 여부를하지만 여부를 결정할 수없는 것입니다 중지합니다.


-1

나는 이것이 공식적으로 정답이 아니라는 것을 알고 있지만 일단 'Turing-complete'에서 '최소'를 가져 와서 '실제'를 다시 넣으면 프로그래밍 언어와 구별되는 가장 중요한 기능을 볼 수 있습니다 마크 업 언어는

  • 변수
  • 조건부 (if / then ...)
  • 반복 (루프 / 브레이크 중 ...)

다음은

  • 익명 및 명명 된 함수

이러한 어설 션을 테스트하려면 HTML과 같은 마크 업 언어로 시작하십시오. 변수 만 있거나 조건부 만 사용하거나 (MS는 조건부 주석으로 처리 했음) 또는 일종의 루프 구성 (조건부 부재시 아마도)으로 HTML +를 만들 수 <repeat n='4'>...</repeat>있습니다. 이 중 하나를 수행하면 HTML +가 일반 HTML보다 훨씬 강력 해지지 만 프로그래밍 언어보다 여전히 마크 업이됩니다. 각각의 새로운 기능을 사용하면 선언적이지 않고 명령형 언어가됩니다.

논리와 프로그래밍의 최소화에 대한 탐구는 중요하고 흥미 롭습니다. 그러나 젊거나 오래된 n00bies에게 '프로그래밍이란 무엇입니까?'와 '프로그래밍을 배우는 방법'을 가르쳐야한다면 전체 폭과 너비로 시작하기가 어렵습니다. Turing 완전성의 이론적 기초. 요리와 프로그래밍의 본질은 엄마가 그랬던 것처럼 준비가 될 때까지 반복하여 올바른 순서로 일을하는 것입니다. 그것은 나를 위해 요약합니다.

다시는 CS를 끝내지 않았습니다.


2
확실하지 않은 경우 먼저 조사해야합니다. fractranbrainf * ck 와 마찬가지로 완전 튜링 입니다. 참고 또한 HTML 5 + CSS 3 가 구현할 수 있기 때문에 튜링 완료 규칙 110 .

1
yesyesyes 알고 있습니다. 그러나 주어진 모든 예는 다소 난해하고 (아마도 흥미 롭거나 놀랍지 만), 나의 대답은 실용적이며, 아마도 최소한도는 아닙니다. 이 페이지가 Google에서 Turing-completeness를 검색 할 때 1 위를 차지했다는 점을 지적하는 것이 중요하다고 생각합니다. 여기에 대한 답변은 HTML 또는 PHP와 Python의 차이점을 알고 싶어하는 n00bie에게는 거의 사용되지 않는 IMHO입니다. 내가 brainf의 의미 CK가 brainf의 호출되지 않습니다 아무 이유없이 CK.
흐름
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.