튜링을 완성하게 만드는 언어 기능 / 구조의 최소 세트는 무엇입니까?
튜링을 완성하게 만드는 언어 기능 / 구조의 최소 세트는 무엇입니까?
답변:
튜링 소위 늪 (tarpit)는 튜링 완성 할 수 가능한 한 적은 수의 요소를 사용하는 동안 노력하고 난해한 프로그래밍 언어의 일종이다. Brainfuck 은 아마도 가장 잘 알려진 타르 핏 일지 모르지만 많은 것이 있습니다.
Iota 와 Jot 는 SK (I) 결합기 계산법 에 따라 각각 2 개와 3 개의 기호가있는 기능 언어입니다 .
OISC ( One Instruction Set Computer )는 하나 이상의 인수에 대한 명령이 하나만 필요한 명령형 계산 유형을 나타냅니다. 일반적으로 "0보다 작거나 같은 경우 빼기 및 분기"또는 "빌리면 빼기 및 건너 뛰기"입니다. x86 MMU 는 이전 명령을 구현하므로 Turing-complete입니다.
일반적으로 명령형 언어가 Turing-complete가 되려면 다음이 필요합니다.
조건부 반복 또는 조건부 점프의 형식 (예 : while
, if
+ goto
)
어떤 형태의 스토리지 (예 : 변수, 테이프)를 읽고 쓰는 방법
A의 람다 계산법은 TC를 할 함수형 언어 기반, 그것은 필요합니다 :
인수에 대한 함수를 추상화하는 기능 (예 : 람다 추상화, 인용)
인수에 함수를 적용하는 기능 (예 : 축소)
물론 다른 계산 방법도 있지만 Turing tarpits의 일반적인 모델입니다. 실제 컴퓨터가 유의 하지 보편 튜링 기계 가 무제한의 스토리지를 필요가 없기 때문에. 엄밀히 말하면“바운드 스토리지 시스템”입니다. 메모리를 계속 추가해야한다면 튜링 머신에 전원을 공급할 것입니다. 그러나 바운드 스토리지 시스템과 유한 상태 시스템 도 계산에 유용합니다. 그것들은 단순히 보편적 이지 않다 .
엄밀히 말하면, Turing-completeness에는 I / O가 필요하지 않습니다. TC는 언어가 원하는 기능을 계산할 수 있다고 주장하지만 결과를 보여줄 수 는 없습니다 . 실제로, 모든 유용한 언어는 어떻게 든 세상과 상호 작용하는 방법을 가지고 있습니다.
보다 실용적인 관점에서 : Turing-complete 언어의 모든 프로그램을 귀하의 언어로 번역 할 수 있다면, 귀하의 언어는 Turing-complete 여야합니다. 따라서 디자인 한 언어가 Turing-complete인지 확인하려면 YourLanguage 컴파일러에 Brainf ***를 작성하고 모든 합법적 인 BF 프로그램을 컴파일 할 수 있음을 증명 / 시연 할 수 있습니다.
명확히하기 위해, YourLanguage의 인터프리터 외에도 BF 프로그램을 YourLanguage로 컴파일 할 수있는 컴파일러 (모든 언어로)를 작성합니다 (물론 동일한 의미를 유지함).
</sarcasm>
시스템이 범용 Turing 기계로 할 수있는 작업을 수행 할 수있는 경우에만 Turing 완료 상태로 간주 될 수 있습니다. 범용 튜링 기계는 주어진 시간에 계산 가능한 기능을 해결할 수 있다고 말했기 때문에 튜링 전체 시스템은 확장 적으로도 그렇게 할 수 있습니다.
Turing이 완전한지 확인하려면 내부에 Turing 기계를 구현할 수 있는지 확인하십시오. 즉, 다음을 시뮬레이션 할 수 있는지 확인하십시오.
튜링이 완료된 것으로 간주되는 시스템의 실제 최소 요구 사항입니다. 더 이상 아무것도 없습니다. 어떤 방식 으로든 이들 중 어느 것도 시뮬레이션 할 수 없다면 튜링이 완료되지 않은 것입니다. 다른 사람들이 제안한 방법은 그러한 기능을 갖지 않는 여러 Turing complete 시스템이 있기 때문에 단지 끝을 의미합니다.
실제로 진정한 Turing complete 시스템을 구축 할 수있는 알려진 방법은 없습니다. 물리적 공간 내에서 튜링 머신 테이프의 무한 성을 실제로 시뮬레이션 할 수있는 알려진 방법이 없기 때문입니다.
프로그래밍 언어를 사용하여 프로그래밍을 수행 할 수 있으면 프로그래밍 언어가 작동합니다. 언어 튜링을 완료하는 기능 세트가 하나도 없으므로 루프가 필요하거나 튜링이 완료 되지 않은 언어가 있기 때문에 변수가 필요하다는 답변이 잘못 되었습니다.
Alan Turing은 유니버설 튜링 머신을 만들었으며 유니버설 머신에서 작동하도록 설계된 프로그램을 귀하의 언어로 실행하도록 번역 할 수 있다면 Turing도 완료되었습니다. 이것은 또한 간접적으로 작동하므로 모든 범용 튜링 기계 프로그램을 Y 프로그램으로 변환 할 수 있기 때문에 완전한 언어 Y를 튜링하기위한 모든 프로그램을 X로 변환 할 수 있으면 언어 X가 튜링 완료라고 말할 수 있습니다.
시간 복잡성, 공간 복잡성, 쉬운 입 / 출력 형식 및 모든 프로그램 작성 용이성은 방정식에 포함되어 있지 않으므로 이러한 기계는 전력 손실로 인해 계산이 중단되거나 지구가 태양에 의해 삼키지 않으면 이론적으로 모든 계산을 수행 할 수 있습니다.
일반적으로 튜링 완성도를 입증하기 위해 튜링 완료 언어로 판명 된 통역사가 있지만, 제대로 작동하려면 입력 및 출력 수단이 필요합니다. 언어가 튜링 완료에 실제로 필요하지 않은 두 가지가 있습니다. 프로그램이 시작시 상태를 변경하고 프로그램이 중지 된 후 메모리를 검사 할 수 있으면 충분합니다.
성공적인 언어를 만들기 위해서는 튜링 완전성 이상이 필요하며 타르타르 타르트에도 마찬가지입니다. BrainFuck 이 ,
and 없이는 인기를 얻지 못했다고 생각 .
합니다.
무한 반복 또는 중지 여부를 알 수 없습니다.
설명 : 입력이 주어지면 모든 경우에 (다른 튜링 머신을 사용하여) 실행하지 않는 한 무한 반복되거나 결국 멈출 지 여부를 알 수는 없습니다 (정지되면 응답하지 않습니다) 반복된다면!).
이것은 잠재적으로 무제한의 양의 데이터를 어떤 방식 으로든 저장할 수 있어야 함을 의미합니다. 아무리 복잡하더라도 무한 테이프와 동등한 값이 있어야합니다! (그렇지 않으면 유한 한 수의 상태 만있을 수 있으며, 이전에 해당 상태를 겪었는지 확인한 후 결국 중지 할 수 있습니다). 일반적으로 튜링 기계는 제어 가능한 수단으로 상태의 크기를 늘리거나 줄일 수 있습니다.
튜링의 원래 범용 튜링 기계에는 해결할 수없는 정지 문제가 있으므로, 자신의 튜링 전체 기계에도 해결할 수없는 정지 문제가 있어야합니다.
Turing complete 시스템은 다른 Turing complete 시스템을 에뮬레이션 할 수 있으므로 시스템에 잘 알려진 Turing complete 시스템에 대한 에뮬레이터를 구축 할 수 있으면 시스템도 Turing 완료된 것입니다.
예를 들어, 무한 반복 격자 패턴이있는 보드 (상단과 왼쪽에 다른 버전이 있음)가 제공되면 Snakes & Ladders가 튜링이 완료되었음을 증명한다고 가정하십시오. 2 카운터 Minsky 기계가 Turing complete (2 개의 무제한 카운터와 유한 숫자 중 1 개의 상태를 가짐)를 알면 그리드의 X 및 Y 위치가 2 카운터의 현재 값인 동등한 보드를 구성 할 수 있습니다 현재 경로는 현재 상태입니다. 쾅! Snakes & Ladders가 튜링 완료되었음을 증명했습니다.
필요한 조건 중 하나는 반복 이전에 결정되지 않은 최대 반복 횟수 또는 최대 재귀 깊이가 사전에 결정되지 않은 재귀 인 루프입니다. 예를 들어, for ... in ... 루프는 많은 최신 언어로 언어 튜링을 완료하기에 충분 하지 않지만 다른 방법을 사용한다는 것을 알았습니다. 이는 반복 횟수 제한이나 재귀 깊이 제한이 아니라 최대 반복 횟수와 재귀 깊이를 미리 계산해야합니다.
예를 들어 Ackermann 함수는 이러한 기능이없는 언어로 계산 될 수 없습니다. 반면에 이러한 기능을 요구하지 않고도 매우 복잡하고 유용한 소프트웨어를 많이 작성할 수 있습니다.
반면에, 모든 반복 수와 미리 계산 된 모든 재귀 깊이 만이 프로그램이 중단 여부를하지만 여부를 결정할 수없는 것입니다 중지합니다.
나는 이것이 공식적으로 정답이 아니라는 것을 알고 있지만 일단 'Turing-complete'에서 '최소'를 가져 와서 '실제'를 다시 넣으면 프로그래밍 언어와 구별되는 가장 중요한 기능을 볼 수 있습니다 마크 업 언어는
다음은
이러한 어설 션을 테스트하려면 HTML과 같은 마크 업 언어로 시작하십시오. 변수 만 있거나 조건부 만 사용하거나 (MS는 조건부 주석으로 처리 했음) 또는 일종의 루프 구성 (조건부 부재시 아마도)으로 HTML +를 만들 수 <repeat n='4'>...</repeat>
있습니다. 이 중 하나를 수행하면 HTML +가 일반 HTML보다 훨씬 강력 해지지 만 프로그래밍 언어보다 여전히 마크 업이됩니다. 각각의 새로운 기능을 사용하면 선언적이지 않고 명령형 언어가됩니다.
논리와 프로그래밍의 최소화에 대한 탐구는 중요하고 흥미 롭습니다. 그러나 젊거나 오래된 n00bies에게 '프로그래밍이란 무엇입니까?'와 '프로그래밍을 배우는 방법'을 가르쳐야한다면 전체 폭과 너비로 시작하기가 어렵습니다. Turing 완전성의 이론적 기초. 요리와 프로그래밍의 본질은 엄마가 그랬던 것처럼 준비가 될 때까지 반복하여 올바른 순서로 일을하는 것입니다. 그것은 나를 위해 요약합니다.
다시는 CS를 끝내지 않았습니다.