Turing Complete 란 무엇입니까?


답변:


324

가장 간단한 설명은 다음과 같습니다.

튜링 컴플리트 (Touring Complete) 시스템은 응답을 찾을 수있는 프로그램을 작성할 수있는 시스템을 의미합니다 (런타임 또는 메모리에 대한 보장은 없지만).

따라서 누군가가 "실제로 자주는 아니지만"원칙적으로 "내 새로운 것은 Turing Complete"라고 말하면 계산 문제를 해결하는 데 사용될 수 있습니다.

언젠가는 농담입니다. 한 남자가 vi에서 튜링 머신 시뮬레이터를 썼기 때문에 vi가 세계에서 유일하게 필요한 계산 엔진이라고 말할 수 있습니다.


18
자세한 내용은 주석이 달린 튜링을 참조하십시오. 매우 접근하기 쉽습니다. amazon.com/Annotated-Turing-Through-Historic-Computability/dp/…
i_am_jorf

43
"실제로는 그렇지 않음"이 잘못되었습니다. 실현 가능한 시스템에는 무한 테이프가 없기 때문에 실제로는 시스템이 튜링 완료되지 않습니다. 실제로 의미하는 바는 일부 시스템은 사용 가능한 메모리의 한계까지 Turing-completeness를 근사화 할 수 있다는 것입니다.
쉘비 무어 III

22
그러나 VI는 지금 ... ;-) 세계에서 필요한 유일한 계산 엔진이다
조 에드가

4
이맥스도 터닝 머신입니까? XD
alem0lars

6
최근에 누군가 PowerPoint가 Turing Complete 인 것으로 나타났습니다.
Tagc

192

가장 간단한 설명은 다음과 같습니다

Alan Turing은 프로그램을 작성하고 해당 프로그램을 실행하며 결과를 보여줄 수있는 머신을 만들었습니다. 그러나 그는 프로그램마다 다른 기계를 만들어야했습니다. 그래서 그는 모든 프로그램을 가지고 실행할 수있는 "Universal Turing Machine"을 만들었습니다.

프로그래밍 언어는 가상 머신이지만 해당 머신과 유사합니다. 그들은 프로그램을 가지고 실행합니다. 이제 충분한 시간과 메모리가 주어진 튜링 머신이 실행할 수있는 프로그램 (언어에 관계없이)을 실행할 수 있다면 이제 프로그래밍 언어를 "완료 중"이라고합니다.

예를 들어 : 10 개의 숫자를 받아서 더하는 프로그램이 있다고 가정 해 봅시다. 튜링 머신은이 프로그램을 쉽게 실행할 수 있습니다. 그러나 어떤 이유로 든 프로그래밍 언어가 동일한 추가 기능을 수행 할 수 없다고 상상해보십시오. 이것은 "불완전한 투어"(말하자면)입니다. 반면, 범용 Turing 머신이 실행할 수있는 프로그램을 실행할 수 있으면 Turing이 완료된 것입니다.

대부분의 최신 프로그래밍 언어 (예 : Java, JavaScript, Perl 등)는 추가, 곱셈, if-else 조건, return 문, 저장 / 검색 / 삭제 방법과 같은 프로그램을 실행하는 데 필요한 모든 기능을 각각 구현하기 때문에 튜링 완료입니다. 데이터 등.

업데이트 : 내 블로그 게시물 "자바 스크립트가 완료되었습니다" 에 대한 자세한 내용을 볼 수 있습니다 — 설명


5
Turing과 다른 초기 컴퓨터 과학자들이 특정 문제를 해결하고 싶을 때마다 특정 컴퓨터를 만들었 음을 기억할 때 이런 종류의 기계에 대한 용어가있을 것이라는 생각은 훨씬 더 의미가 있습니다. 우리는 영원히 다시 프로그래밍 할 수있는 하나의 컴퓨터에 익숙합니다. 상황에 감사드립니다, 라자
Jacob Ford

자바 스크립트가 어떻게 완성 될 수 있습니까? 파일 시스템, 적절한 멀티 스레딩 API가 없습니다. 브라우저 보안 샌드 박스 특성으로 인해 많은 제한이 있습니다. '프로그래밍 언어'라고하는 경우는 거의 없습니다. JS가 가지고 있지 않은 것을 보상하기 위해 스크립팅 추상화의 변형이 몇 가지 있는지 (반응 형, typescript ..you라고 명명) 확인하십시오. (여기에 asm.js를 언급해야합니다). Java, Python 또는 C ++는 진정한 'Turing Complete'예제입니다. 하지만 JS? 나는 그렇게 생각하지 않습니다.
Michael IV

2
@MichaelIV 투어링 머신에는 파일 시스템 / 스레드도 없습니다. JS는 절대적으로 완전한 여행입니다.
Bax

@MichaelIV Bax의 응답에 추가하기 위해 현대 컴퓨터를 언급 한 멋진 모든 것들을 허용하기 위해 함께 작동하는 여러 Turing 머신 으로 구성하는 것을 고려할 수 있습니다. 예를 들어 CPU는 GPU가 읽을 수 있도록 "테이프"를 생성하여 모니터가 "테이프"를 쓸 수 있도록 모니터에 "테이프"를 쓸 수 있도록합니다. 마찬가지로, CPU는 하드 드라이브, NIC, 사운드 카드 등에 "테이프"를 생성 할 수 있습니다.

86

에서 위키 피 디아 :

Alan Turing의 이름을 딴 튜링 완성도는 지금까지 진보 된 컴퓨팅 장치를위한 모든 그럴듯한 디자인이 보편적 인 튜링 머신에 의해 모방 될 수 있다는 점에서 중요합니다. 따라서, 범용 튜링 기계의 역할을 할 수있는 기계는 원칙적으로 다른 프로그램 가능한 컴퓨터가 할 수있는 모든 계산을 수행 할 수 있습니다. 그러나 이것은 기계에 대한 프로그램을 작성하는 데 필요한 노력, 기계가 계산을 수행하는 데 걸리는 시간 또는 기계와 관련이없는 기계가 가질 수있는 능력과는 아무런 관련이 없습니다.

진정한 Turing-complete 머신은 물리적으로 불가능할 수 있지만 무제한 스토리지가 필요하기 때문에 Turing 완성도는 스토리지가 무제한 인 경우 보편적 인 물리적 머신 또는 프로그래밍 언어로 인해 느슨하게 나타납니다. 이 점에서 모든 최신 컴퓨터는 튜링이 완료되었습니다.

"완전한 의미는 '충분한 시간과 공간이 주어지면 계산 가능한 문제에 대답 할 수있다"는 말을 제외하고는 기술보다 비 기술적 인 방법을 모릅니다.


4
이와 관련하여 "컴퓨팅 장치"란 무엇입니까?
dopatraman

30
대부분의 Wikipedia 기사와 마찬가지로이 인용문은 기술적으로 정확하지만 주제에 대해 잘 모르고 이해하려고하는 사람에게는 가치가 없습니다. 제대로 설명 할 수 있다는 것은 그 자체의 과학입니다 :)
Lacho Tomov

76

비공식적 정의

튜링 완성 언어는 모든 계산을 수행 할 수있는 언어입니다. 교회 튜링의 논문의 모든 수행 가능한 계산은 튜링 기계에 의해 수행 될 수있는 상태. 튜링 기계는 무한 랜덤 액세스 메모리와 유한 '프로그램'을 가진 기계가 지시는, 그것이 어떤 결과를 종료해야하는 메모리에서 쓰기 및 이동, 그리고 무엇 다음에 무엇을해야을 읽어야합니다. 튜링 머신으로의 입력은 시작하기 전에 메모리에 저장됩니다.

튜링되지 않은 언어를 만들 수있는 것들

튜링 기계는 메모리에 보는 것을 기반으로 의사 결정을 내릴 수 만 지원이 있다는 '언어'- +, -, *, 그리고 /그것의 입력에 따라 선택을 할 수 없기 때문에 정수에 완료 튜링되지 않습니다,하지만 튜링 기계가 있습니다.

Turing 머신은 영원히 실행될 수 있습니다. Java, Javascript 또는 Python을 가져 와서 루프, GOTO 또는 함수 호출을 수행하는 기능을 제거하면 임의의 계산을 수행 할 수 없으므로 Turing이 완료되지 않습니다. 결코 끝나지 않습니다. Coq 는 종료되지 않는 프로그램을 표현할 수없는 정리 증명 자이므로 Turing이 완료되지 않았습니다.

튜링 머신은 무한 메모리를 사용할 수 있습니다. 튜링 머신은 무한 메모리를 사용할 수 있기 때문에 정확히 자바와 같지만 4 기가 바이트 이상의 메모리를 사용한 후에는 종료되는 튜링 시스템이 아닙니다. 우리가 실제로 할 수없는 이유입니다 구축 튜링 기계를하지만, 자바 때문에 자바는 여전히 튜링 완전한 언어 언어는 무한한 메모리를 사용을 방지에는 제한이 없습니다. 이것이 정규 표현식이 튜링이 완료되지 않은 이유입니다.

튜링 기계는 랜덤 액세스 메모리가 - 단지 당신을 통해 메모리에서 작동 할 수있는 언어 pushpop스택에 작업이 완료 튜링되지 않습니다. 문자열을 한 번 읽고 스택에서 밀고 터지는 방식으로 만 메모리를 사용할 수 있는 '언어'가 (있는 경우 문자열을 )(때 튀어 나올 때 밀면 나중에 문자열 자체가 있는지 여부를 알 수 있습니다 ). 모든이 경우, 그것은 나를 말할 수없는 (자신의가 )에 이상이 모든이 [그것의 자신의 ](주 나중에 ([)]이 기준을 충족하지만, ([]]하지 않습니다). 튜링 기계 추적하기 위해 랜덤 액세스 메모리를 사용할 수 ()의 및[]별도이지만 스택 만있는이 언어는 사용할 수 없습니다.

튜링 머신은 다른 튜링 머신을 시뮬레이션 할 수 있습니다. 튜링 머신은 적절한 '프로그램'이 주어지면 다른 튜링 머신의 '프로그램'을 가져와 임의의 입력에서 시뮬레이션 할 수 있습니다. 파이썬 인터프리터를 구현할 수없는 언어가 있다면 튜링이 완벽하지 않을 것입니다.

튜링 언어의 예

언어에 무한 랜덤 액세스 메모리, 조건부 실행 및 반복 된 실행 형식이 있으면 튜링이 완료된 것일 수 있습니다. 튜링 머신이 할 수있는 모든 것을 여전히 달성 할 수있는 더 이국적인 시스템이 있습니다.

  • 형식화되지 않은 람다 미적분
  • 콘웨이의 인생 게임
  • C ++ 템플릿
  • 프롤로그

11
SQL은 가장 확실합니다. 모든 계산이 가능한 스크립팅 기능이 있습니다.
nzifnab

53
아니요, SQL을 T-SQL / PL-SQL과 같은 확장과 혼동하고 있습니다. ANSI SQL이 완료되지 않았습니다. 그러나 TSQL / PLSQL-입니다.
Agnius Vasiliauskas

15
분명히 SQL은 튜링 완료되었습니다 : stackoverflow.com/questions/900055/…
Newtang

2
튜링 완전성 에 따르면 -단일 탭 튜링 기계를 시뮬레이션하는 데 사용할 수 있으면 시스템이 튜링 완료입니다. 그러나 위의 예에서 개발자가 이해 cyclic tag system하고 특정 하지는 않았습니다 universal cyclic tag system. 따라서 기사는 SQL Turing 완전성을 증명하지 못합니다. (또는 내가 잘못 이해
했음

2
무한 테이프가 없기 때문에 Turing-complete 언어의 실현 가능한 구현은 없습니다. 실제로 의미하는 바는 일부 언어는 호스트 시스템의 사용 가능한 메모리 한계까지 Turing-completeness를 근사화 할 수 있다는 것입니다.
쉘비 무어 III

17

기본적으로 Turing-completeness는 무한한 재귀라는 하나의 간결한 요구 사항입니다.

메모리에 묶여 있지도 않습니다.

나는 이것을 독립적으로 생각했지만 여기 에 주장에 대한 토론 이 있습니다. LSP에 대한 나의 정의 는 더 많은 맥락을 제공합니다.

다른 답변은 Turing-completeness의 기본 본질을 직접 정의하지는 않습니다.


유한 상태 오토마타는 무한한 재귀를 가질 수 있습니다. 적절한 사례 : a*.

3
@Rhymoid FSM 은 메모리가 제한적 이지만 (유한 한 수의 상태) 테일 최적화가없는 무한 재귀에는 무제한 메모리가 있어야합니다. 꼬리 최적화를 통해서만 내 정의를 무제한 재귀의 하위 집합으로 제한하지 않았습니다. downvote를 친절하게 제거하십시오.
쉘비 무어 III

무한 재귀 안개의 정의를 유지했습니다. '원시 재귀'의 의미에서 '재귀'를 의미하고 '부분적'(또는 '일반'또는 'mu-')으로 '무제한'을 의미합니까? 그렇다면 당신이 옳을 수도 있습니다. 그러나 현재의 공식은 David Harel의 "On Folk Theorems"에서 비판 된 진술과 너무 가깝습니다. 수학을 엄격하게하는 것이 중요하며 정확한 정의를 생략하면 무시하는 것입니다. 그건 그렇고 : 상호 작용을 모델링하기 위해 FSM을 일반화 할 수 있습니다. TM과 구별되는 것은 후자의 환경도 테이프로 모델링된다는 것입니다.

@Rhymoid 열거는 정밀도의 대립입니다. 예를 들어 1 인치의 분수의 최대 정밀도를 열거합니다. 무한 재귀는 가능한 모든 형태의 재귀를 의미하며, 무한 테이프 없이는 불가능합니다. 완전히 일반화 된 재귀 (모델 내에서 일반적인 것이 아니라)는 항상 Turing-complete입니다. 일반화 된 재귀와 가능한 계산을 수행하는 능력 사이의 동등성을 진술하고 있습니다. 이것은 주목할만한 중요한 내용입니다.
쉘비 무어 III

"무한한 재귀는 가능한 모든 형태의 재귀를 의미합니다 . "이것이 당신의 독서입니다. 대부분의 SO 사용자에게 '무제한 재귀'는을 의미 while (p) { /* ... */ }합니다. "전반적인 재귀와 가능한 계산을 수행하는 능력 사이의 동등성을 진술하고 있습니다." 교회의 논문은 매우 다른 문제이므로 실제로 별도로 논의 해야합니다 .

13

튜링 컴플리트는 튜링 머신 만큼 강력하다는 것을 의미합니다 . 이는 Turing Machine으로 계산할 수있는 모든 것이 Turing Complete 시스템으로 계산 될 수 있음을 의미합니다.

아무도 튜링 머신보다 강력한 시스템을 아직 찾지 못했습니다. 따라서 당분간 시스템이 튜링 컴플리트라고 말하는 것은 시스템이 알려진 컴퓨팅 시스템만큼 강력하다고 말하는 것과 같습니다 ( 교회 순회 논문 참조 ).


3
이 모든 시간은 벽 시간을 무시합니다. 그냥 "할 수있다"고 말합니다.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen은 실제로 물리적 계산 능력을 완전히 무시합니다. 우주의 나이보다 오래 걸릴 수있을뿐만 아니라 우주의 모든 fermions와 boson으로 구성 될 수있는 것보다 더 많은 메모리를 사용할 수도 있습니다.
Waylon Flinn

아마도 우주에는 보손과 페르미온의 양에 제한이 없습니다. 우리는 크기와 크기를 모릅니다. '우주'에서 X의 수에 대해 읽을 때마다 사람들은 실제로 관측 가능한 우주 에 대해 이야기하고 있습니다. 흥미롭지 만 실제 물리적 한계는 아닙니다.
Stijn de Witt

9

가장 간단한 용어로 Turing-complete 시스템은 가능한 모든 계산 문제를 해결할 수 있습니다.

주요 요구 사항 중 하나는 스크래치 패드 크기에 제한이 없으며 이전 스크래치 패드 쓰기에 액세스하기 위해 되 감을 수 있습니다.

따라서 실제로 어떤 시스템도 Turing-complete가 아닙니다.

오히려 일부 시스템은 무한 메모리를 모델링하고 시스템 메모리에 맞는 가능한 계산을 수행하여 Turing-completeness에 근접합니다.


2

"Turing Complete"라는 개념의 중요성은 프로세스를보다 간단하고 단순한 "간단한"명령으로 분해 할 수있는 컴퓨팅 머신 (기계적 / 전기적 "컴퓨터"일 필요는 없음)을 식별하는 능력에 있다고 생각합니다. Universal 머신이 해석하고 실행할 수있는 명령.

저는 Annotated Turing을 강력히 추천합니다

@ Mark 나는 당신이 설명하는 것이 Universal Turing Machine에 대한 설명과 Turing Complete의 혼합이라고 생각합니다.

실제로 Turing Complete는 Universal Machine (데스크톱 컴퓨터)에 의해 실행되는 프로그램으로 작성되고 표현 될 수있는 머신 / 프로세스 / 계산 일 것입니다. 다른 사람들이 언급했듯이 시간이나 저장 공간은 고려하지 않습니다.


2

간단한 단어로 이해하는 것 :

Turing Complete : 계산을 수행 할 수있는 프로그래밍 언어 / 프로그램은 Turing complete입니다.

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

  1. 당신은 그냥 사용하여 두 개의 번호를 추가 할 수 HTML을 . (Ans는 ' No '이므로 자바 스크립트를 사용하여 추가를 수행해야합니다.) 따라서 HTML은 Turing Complete가 아닙니다.

  2. Java, C ++, Python, Javascript, Ethereum 용 Solidity 등과 같은 언어는 Turing Complete입니다.이 언어를 사용하여 두 개의 숫자를 추가하는 것과 같은 계산을 수행 할 수 있기 때문입니다.

도움이 되었기를 바랍니다.


0

테스트하고 분기 할 수 있으면 완료됩니다 ( 'if'가 있음)


1
이러한 오래된 질문의 경우, 다른 사람이 이미 이미 유사하거나 더 실질적인 기여를했는지 확인하는 가치가 확인 될 것
ocallaghan 앨런을

답이 정확한지 확실하지 않습니다. 그러나 이것은 결코 전에 본 적이없는 간단한 설명입니다. 재밌는 점 : 오래 전에 (첫 번째 코드를 작성한 후) 나는 가장 간단한 프로세서를 정의하기 위해 동일한 설명을 사용했습니다.
빅터 Yarema

정확하고 간결하며 정확한 운영 정의에 대한 첫 번째 시도입니다. 그러나 브랜치는 루핑을 허용해야하며 머신이 서브 루틴 호출을 허용해야하는 경우가 아닙니까 (예 : 재귀)? 재귀가있는 모든 프로그램에 대해 중첩 된 루프로 구성된 평면 프로그램이 있습니까?
user3673

0

Turing Machine은 모든 프로그램이 조건 테스트를 수행 할 수 있어야합니다. 그것은 기본입니다.

플레이어 피아노 롤을 고려하십시오. 플레이어 피아노는 매우 복잡한 음악을 연주 할 수 있지만 음악에는 조건부 논리가 없습니다. 튜링 완료입니다.

조건부 논리는 Turing Complete 인 기계의 힘과 위험입니다.

피아노 롤은 항상 정지되도록 보장됩니다. TM에 대한 그러한 보증은 없습니다. 이것을 "중지 문제"라고합니다.


-1

Waylon Flinn는 말했다 :

튜링 완료는 튜링 머신만큼 강력하다는 것을 의미합니다.

나는 이것이 틀렸다고 믿는다. Turing Machine만큼 강력하다면 시스템은 Turing complete이다. .


1
나는 당신이 교회 튜링 논문이이 결론에 도달하는 것이 사실이라고 가정한다고 생각합니다. 아직 입증되지 않았습니다. 설명하는 속성을 'Turing Equivalent'이라고합니다.
Waylon Flinn

1
@WaylonFlinn 아니, 맞아. "완전성"은 그것이 적어도 물건만큼 강하지 만 더 강하지 않다는 것을 의미합니다. "NP-Complete"과 비교하십시오.
Devin Jeanpierre

3
@DevinJeanpierre 나는 여기서 화염 전쟁을 시작하고 싶지 않지만 설명하는 계산 클래스가 "Turing Equivalent"라고 거의 확신합니다. Turing Complete는 NP-Complete과 비슷한 관계를 맺고 있습니다. NP- 완료는 P = NP 인 경우에만 NP와 같습니다. 같은 방식으로 Turing Complete는 Church-Turing 논문이 올바른 경우에만 Turing Equivalent과 같습니다.
Waylon Flinn

@Waylon 소스? 내가 읽은 내용에 동의하지 않습니다 (예 : en.wikipedia.org/wiki/Turing_completeness )
Devin Jeanpierre

4
@DevinJeanpierre 그것은 당신이 링크하는 wikipedia 기사에서 바로 말합니다. 공식 정의 섹션 인용 : "모든 튜링 계산 가능 기능을 계산할 수있는 계산 시스템을 튜링 완료라고합니다.", "튜링 완료 시스템을 계산할 수있는 모든 기능이 튜링 계산 가능하면 튜링과 동일합니다.
Waylon Flinn

-2

대부분의 프로그래머에게 친숙한 실제 언어 용어에서 Turing 완성도를 감지하는 일반적인 방법은 언어가 중첩 된 무한 명령문의 시뮬레이션을 허용하거나 허용하는지 여부입니다 (고정 된 상한을 갖는 명령문의 파스칼 스타일과 반대).


1
단일 무제한의 while 루프는 튜링 기계를 시뮬레이션하기에 충분하다.
masterxilo

-8

관계형 데이터베이스가 장소와 도로의 위도와 경도를 입력하고 그 사이의 최단 경로를 계산할 수 있습니까? 이것은 SQL이 Turing complete가 아님을 나타내는 한 가지 문제입니다.

그러나 C ++은이를 수행 할 수 있으며 모든 문제를 해결할 수 있습니다. 따라서입니다.


10
점 사이의 최단 경로를 계산할 수 있다는 것은 Turing complete의 정의가 아닙니다. 그 하나의 예보다 훨씬 더 많은 것이 있습니다.
Eva

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