모든 튜링 언어를 서로 바꿔 사용할 수 있습니까


26

프로그래밍 방법을 알고 있지만 CS 이론의 초보자입니다.

이 답변 에 따르면

튜링 완성도는 계산 성의 추상 개념입니다. 언어가 Turing 완료 인 경우 다른 Turing 완료 언어가 수행 할 수있는 계산을 수행 할 수 있습니다.

그리고 어떤 튜링 완전한 언어로 작성된 프로그램은 다른에 다시 작성할 수 있습니다 .

승인. 이것은 말이됩니다. C를 어셈블리로 변환 (컴파일)하고 매일 할 수 있습니다. 어셈블리를 C로 변환 할 수 있습니다 (C로 가상 머신을 작성할 수 있음). 다른 언어에도 동일하게 적용됩니다. 언어를 어셈블리로 컴파일 한 다음 다른 언어로 작성된 VM에서 실행할 수 있습니다.

그러나 할 수 있는 튜링 완전한 언어로 작성된 프로그램은 다른 재 작성?

내 어셈블리에 LIGHTBUTTON opcode가 있으면 어떻게합니까? 전구가 없으면 시스템 (언어)에서 해당 언어를 실제로 모방 할 수 없습니다.

승인. 우리는 컴퓨터 이론을 다루고 있기 때문에 물리적 장치 제한에 대해서는 논의하지 않습니다.

그러나 곱셈이없는 장치는 어떻습니까? 분할? 내가 아는 한, (math.SE에 대한 더 많은 질문이지만) 덧셈과 뺄셈을 사용하여 곱셈 (분할이 아님)을 모방 할 수 없습니다 [1].

그렇다면 "완전한 언어"(추가, 빼기 및 점프)가 추가, 빼기, 곱하기 및 점프를 할 수있는 다른 언어를 어떻게 모방합니까?

편집하다

[1]. 임의의 실수.


33
실수는 Hyper-Turing-Computation의 영역에 속합니다. 튜링 머신은 실수를 처리 할 수 ​​없으며, 튜링 완전성과 관련이 없습니다.
Jörg W Mittag

3
관련 : 어셈블리 언어 명령어 세트 하나의 명령으로 여전히 보편적 인 컴퓨터를 구축 할 수있는 강력한 충분하다 : en.wikipedia.org/wiki/One_instruction_set_computer . 예를 들어, 메모리 피연산자가있는 "0보다 작거나 같은 분기 빼기". 최신 x86에 비해 속도느리지 만 성능 비율은 모든 프로그램에 제한이 없습니다.
Peter Cordes

1
튜링 완전성에는 무한한 저장이 필요하고 우주는 무한하지 않기 때문에 실제 (실제로 존재하는) 기계는 튜링 완성형이거나 완성형이 될 수 없습니다. 이것으로부터 두 개의 추상 기계가 동등한 지에 대한 긍정적 인 대답이 두 기계의 물리적 근사치가 같은지에 대한 질문에 대답하는 데 도움이되지 않습니다.
Ben

2
@PeterCordes : 비율이 유한하다고 말하면 유한 시간에 완료되는 작업이 둘 다에서 유한 시간에 완료된다는 것을 의미합니다. 입력을 포함하지 않은 특정 시스템의 경우 일부 입력에 대한 비율이 얼마나 높은지에 대한 유한 제한. 나는 튜링 컴플리트 머신을 구성하여 임의로 비율을 임의로 높이는 입력을 선택할 수 있다고 생각합니다. 입력 크기의 계산 가능한 기능조차도 아닙니다.
supercat

6
나는 "더하기와 뺄셈으로 곱셈을 (그리고 확실히 나누지 못함) 흉내낼 수 없다"는 아이디어를 어디서 얻었는지 모른다. 우리가 곱하는 법을 배울 때 초등학교에서 배웠습니다
phuclv

답변:


55

Turing-completeness는 한 가지만 말합니다. Turing Machine으로 모델링 할 수있는 계산을 해당 모델로 모델링 할 수있는 경우 계산 모델은 Turing-complete입니다.

Turing Machine이 모델링 할 수있는 계산은 무엇입니까? 무엇보다도 Alan Turing과 그의 모든 동료는 자연수의 함수에만 관심이있었습니다. 따라서 Turing Machine (및 λ-calculus, SK 결합기 미적분, μ 재귀 함수 등)은 자연수에 대한 함수의 계산 가능성에 대해서만 이야기합니다. 자연수에 대한 함수에 대해 이야기하고 있지 않다면 Turing-completeness의 개념은 의미가 없으며 단순히 적용 할 수 없습니다.

그러나 많은 흥미로운 것들을 자연수로 인코딩 할 수 있습니다. 문자열을 자연수로, 그래프를 자연수로, 부울을 자연수로 인코딩 할 수 있습니다. 튜링 머신 을 자연수로 인코딩 하여 튜링 머신에 대해 이야기하는 튜링 머신을 만들 수 있습니다!

물론 자연수의 모든 함수가 계산 가능한 것은 아닙니다. 튜링 머신은 자연수에 대한 일부 함수 만 계산할 수 있으며 λ- 미적분은 자연수에 대한 일부 함수 만 계산할 수 있으며 SK 조합기 미적분은 자연수에 대한 일부 함수 만 계산할 수 있습니다 . 놀랍게도 (아니면) 모든 계산 모델 (실제 우주에서 실제로 실현 가능)은 자연수 (적어도 지금까지 찾은 모든 모델에 대해)에서 동일한 기능을 계산할 수 있습니다 . [참고 : 분명히, 거기에 약한 계산 모델은,하지만 우리는 아직 하나 발견하지 않았습니다 강해실수 또는 시간 여행을 사용하는 모델과 같이 실제 우주와 명백하게 호환되지 않는 일부 제외.]

이 사실은 많은 다른 모델을 오랫동안 검색 한 후에도 매번 정확히 동일한 기능을 계산할 수 있다는 것이 Church-Turing-Thesis의 기초라는 것을 발견했습니다. 계산 모델도 똑같이 강력하며, 모두 "계산 가능"이라는 의미의 "이상적인"개념을 포착합니다. (또한 CTT에는 더 철학적 인 측면이 있습니다. 즉 , 알고리즘을 따르는 사람 은 TM이 계산할 수있는 것과 정확히 동일한 기능을 계산할 수 있다는 것입니다.)

그러나 이것에 대해 아무것도 말하지 않습니다.

  • 다양한 모델의 효율성
  • 그들이 사용 하는 것이 얼마나 편리 합니까
  • 어떤 다른 그들이 할 수있는 외에 자연 번호에 컴퓨팅 기능

그리고 계산 (및 프로그래밍 언어)의 서로 다른 모델의 차이점이 역할을하는 곳을 정확하게이다.

O(sizearray)O(sizearray2)sizearraysizearray

다양한 편의를위한 예로서, 고급 언어로 작성된 코드, 어셈블리로 작성된 코드 및 동일한 문제를 해결하기위한 TM 설명을 비교할 수 있습니다.

그리고 전등 스위치는 세 번째 종류의 차이의 예입니다. 일부 모델은 자연수의 기능이 아니므로 Turing-completeness와는 아무런 관련이 없습니다.

특정 질문에 대답하려면 다음을 수행하십시오.

그러나 할 수 있는 튜링 완전한 언어로 작성된 프로그램은 다른 재 작성?

프로그램이 자연수에 대한 튜링 계산 기능을 계산하는 경우에만 해당됩니다. 그럼에도 불구하고 복잡한 인코딩이 필요할 수 있습니다. 예를 들어, λ- 미적분은 자연 수조차 갖지 않으며 함수를 사용하여 인코딩해야합니다 (함수가 λ- 미적분이 가진 유일한 것이므로).

이 입력 및 출력 인코딩은 알고리즘을 표현할 수있는 것처럼 매우 복잡 할 수 있습니다. 따라서 모든 프로그램 다시 작성할 수는 있지만 다시 작성된 프로그램은 훨씬 더 복잡하고, 더 크며, 더 많은 메모리를 사용하고, 더 느릴 수 있습니다.

내 어셈블리에 LIGHTBUTTON opcode가 있으면 어떻게합니까? 전구가 없으면 시스템 (언어)에서 해당 언어를 실제로 모방 할 수 없습니다.

전구는 자연수에 대한 튜링 계산 기능이 아닙니다. 실제로, 전구는 함수도 아니고 계산도 아닙니다. 전구를 켜고 끄는 것은 I / O 부작용입니다. Turing Machine은 I / O 부작용을 모델링하지 않으며 Turing-completes는 관련이 없습니다.

임의의 실수.

튜링-완전성은 자연수에 대한 계산 가능한 함수 만 다루며 실수와는 관련이 없습니다.

Turing-completeness는 두 가지 이유로 당신과 같은 질문에 관해서는 그리 흥미롭지 않습니다.

  1. 그것은 매우 높은 장애물이 아닙니다. 당신이되고 필요로하는 IF, GOTO, WHILE, 단일 정수 변수 (변수를 가정이 임의의 큰 정수를 저장할 수). 또는 재귀. 많은 것들과 많은 것들이 Turing-complete입니다. 카드 게임 Magic : The Gathering 은 Turing-complete입니다. CSS3은 Turing-complete입니다. sendmail구성 파일은 튜링 완료됩니다. Intel x86 MMU는 Turing-complete입니다. Intel x86 MOV명령어는 Turing-complete입니다. PowerPoint 애니메이션이 튜링 완료되었습니다. Excel (스크립팅없이 공식 만 사용)은 Turing-complete입니다. BGP 라우팅 프로토콜이 Turing-complete입니다. sed튜링 완료입니다. 아파치 mod_rewrite규칙은 Turing-complete입니다. " (실수로 또는 놀랍게도) 튜링 완료를 위한 Google거의 모든 것이 Turing-complete이면 Turing-complete가 흥미로운 속성이되는 것을 멈 춥니 다.
  2. 실제로 유용 할 필요는 없습니다. 유용한 많은 것들이 Turing-complete 가 아닙니다 . 버전 3 이전의 CSS는 Turing-complete 가 아니며 CSS3 실제로 아무도 사용되지 않는다는 사실입니다. 1999 년 이전의 SQL은 Turing-complete가 아니었지만 그 당시에도 매우 유용했습니다. 추가 라이브러리 가없는 C 프로그래밍 언어 는 Turing-complete 인 것처럼 보이지 않습니다 . 의존적으로 유형이 지정된 언어는 튜링 완료가 아닌 정의에 따라 다소 차이가 있지만 운영 체제, 웹 서버 및 게임을 언어로 작성할 수 있습니다.

Idris의 저자 인 Edwin Brady는 "Tetris-complete"라는 용어를 사용하여 이러한 측면에 대해 이야기합니다. 테트리스가 완전하다는 것은 엄격하게 정의되어 있지 않지만 ( "테트리스를 구현하는 데 사용될 수있는 명백한 것"외에), 수준 높고 표현력이 뛰어나서 게임을 작성할 수있을 정도로 미친 듯이 표현할 수 있습니다. 외부 세계 (입력 및 출력)와 상호 작용하고 부작용을 표현할 수 있으며 이벤트 루프를 작성할 수 있으며 반응 형, 비동기 및 동시 프로그래밍을 표현할 수 있으며 운영 체제와 상호 작용할 수 있습니다. 외국 라이브러리와의 상호 작용 (즉, C 코드로 호출하고 호출 할 수 있음) 등. 이것들은 Turing-completeness보다 범용 프로그래밍 언어의 훨씬 흥미로운 기능입니다.


흥미로운 질문에 대한 내 답변을 찾을 수 있습니다 .이 질문은 다른 질문에 답변하더라도 동일한 요점에 닿습니다.


7
나는이 답변을 정말로 좋아하지만, 우리는 모든 종류의 흥미로운 것들을 자연수로 나타낼 수 있다는 점에 주목할 가치가 있다고 생각합니다. 예를 들어 문자열을 자연수로 나타낼 수 있고 그래프를 자연수로 나타낼 수 있으며 컴퓨터 메모리의 전체 상태를 자연수로 나타낼 수 있습니다. 실수는 자연수에 대한 함수로 코딩 될 수 있고 자연수에 대한 (많은) 함수는 자연수에 의해 코딩 될 수 있습니다. 따라서 자연수에서 자연수로의 기능 제한은 어두워서 컴퓨터의 조명을 켜지 않으려는 한 큰 제한이 아닙니다.
Theodore Norvell

3
좋은 대답이지만, "Turing-complete가 흥미로운 자산이되는 것을 멈추는 것"은 명백한 잘못입니다. 튜링이 완료된 경우 중단 문제보다 튜링 기계의 정지 문제를 계산 가능한 감소시켜 튜링 완료입니다. 예를 들어, 카드 게임 Magic : The Gathering is Turing-complete입니다. 이것은 규칙이 결정 불가능 하다는 것을 의미합니다 . 즉, 일반적인 경우에는 다음 게임 상태가 무엇인지 계산할 수 없습니다. 이는 매우 흥미로운 속성입니다. 더 심각하게, 우리는 튜링 완전성 및 축소를 사용하여 결정 불가능한 문제를 증명합니다.
quicksort

튜링과 그의 동료들은 자연수의 함수에 관심이 있었지만, 튜링 기계 는 실제로 숫자를 다루지 않고 일련의 기호를 다루고 있습니다. 분명히 알려진 유한 알파벳의 유한 기호를 자연수로 간단히 해석 할 수 있지만 TM은 입력으로 직접 "숫자"를 수행하지 않고 "숫자"만 조작합니다. 실제로 TM의 표준 설명에서 "자연수의 함수"로 이동하려면 약간의 논리가 필요합니다. TM을 사용할 때 문자열은 숫자가 아닌 문자열로 자연수를 인코딩합니다.
Ben

이것은 분명히 좋은 대답이지만 OP의 이해를 넘어서는 것이 아니라고 생각합니다. OP는 (실수의 유한 서브 세트) 곱셈을 구현하는 것에 대해 이미 혼란스러워합니다. 이 점을 감안할 때 실제로 Turing-complete 프로그래밍 언어는 순수한 계산을 위해 교환 할 수 없으며 실제로 ( 현대 CPU 가하는 것 ( 일부 뿐만 아니라) 모든 것이 자연스럽게 인코딩 될 수 있기 때문에) 번호).
Konrad Rudolph

9
@TheodoreNorvell 자연수로 실수를 인코딩하는 주제. 실제로 거의 모든 실수는 자연수로 인코딩 할 수 없습니다. 자연수에 의해 인코딩되어 자연수에 의해 인코딩 될 수있는 실수의 세트는 최대 개수에 제한이 없다. 그리고 그것은 셀 수없이 무한하기 때문에 세트의 측정 값은 0입니다. 우리는 자연수로 일반적으로 실수를 표현할 수 있다고 말하는 것은 약간 모순적입니다.
셔플 팬츠

9

물론 덧셈과 뺄셈으로 곱셈을 구현할 수 있습니다.

/* Assume b is positive for simplicity */
int multiply(int a, int b) {
  int res = 0;
  while (b > 0) { res += a; b -= 1; }
  return res;
}

당신이 그렇게하지 않을 것이라는 사실이 그것을 가능하게하지는 않습니다.

사단은 더 어렵지 않습니다.

/* Assume a and b are positive for simplicity */
int divide(int a, int b) {
  int res = 0;
  while (a >= b) { res += 1; a -= b; }
  return res;
}

그리고 곱셈과 나눗셈이 실제로 CPU의 회로에 의해 어떻게 수행된다고 생각합니까? 힌트 : 거대한 조회 테이블이 아닙니다. 비트 시프 팅도 사용되기 때문에 위의 것보다 효율적이지만 더하기와 빼기의 관점에서 기본적으로 구현됩니다.


4
2precision

7
@touring : 부동 소수점 코 프로세서가 있기 전에 부동 소수점 산술을 사용할 수 있다는 것을 알고 있습니다.
rici

6

튜링 완전성에는 무한한 저장이 필요하고 우주는 무한하지 않기 때문에 실제 (실제로 존재하는) 기계는 튜링 완성형이거나 완성형이 될 수 없습니다.

이것으로부터 두 개의 추상 기계가 동등한 지에 대한 긍정적 인 대답이 두 기계의 물리적 근사치가 같은지에 대한 질문에 대답하는 데 도움이되지 않습니다.

따라서 (예를 들어) 두 언어의 추상 모델의 튜링 (Turing) 동등성이 각각 다른 언어가 실제로 계산할 수있는 모든 것을 계산할 수 있다는 것을 의미하지는 않습니다. 하나는 다른 한계보다 물리적 한계에 부딪 칠 수 있습니다.


그러나 질문은 언어에 관한 것이었다. 특정 기계를 언급하지만 실제로 실제 기계가 실수로 작동하지 않는다는 것을 깨닫지 못하기 때문에.
Shufflepants 2016 년

3

nm=n+n(m1)m/n=1+(mn)/n

실제로 "add 1", "subtract 1"및 "지정된 레지스터가 0 인 경우 조건부 점프"연산은 계산 모델 Turing-complete를 만들기에 충분합니다 (2- 카운터 기계를 참조로 참조하십시오). 최소한의 Turing-complete 계산 모델).

22n=n+n2m×2n=2m×nm×(2n+1)=m+2m×n


3

TL은, 박사 - 튜링 기계는 일반적으로 논리적 시스템의 작동을위한 단지 기본적인 논리적 인 설명이다. 전문화 된 opcode 호출 및 구성된 수학적 연산을 포함하여 우리가 설명 할 수있는 대부분의 작업을 수행 할 수 있습니다.


내 어셈블리에 LIGHTBUTTON opcode가 있으면 어떻게합니까? 전구가 없으면 시스템 (언어)에서 해당 언어를 실제로 모방 할 수 없습니다.

Turing 모델에서 LIGHTBUTTONopcode 와 같은 기호 는 Turing 컴퓨터가 사용하는 모든 알파벳의 문자열입니다.

따라서 튜링 머신은 문자열 "LIGHTBUTTON"또는 해당 opcode에 해당하는 정수 값 을 생성해야합니다 . 외부 기관이 외부 기업에 영향을 미치는지 여부는 Turing 컴퓨터의 사업이 아닙니다.

C 프로그램은 동일한 제한이 있습니다. 즉, C 프로그램은에 대한 opcode 만 호출 할 수 LIGHTBUTTON있지만 CPU가 실제로 해당 opcode와 연관된 작업을 수행하는지 여부는 CPU에 달려 있습니다.


그러나 곱셈이없는 장치는 어떻습니까? 분할? 내가 아는 한, (이것은 math.SE에 대한 더 많은 질문이지만) [임의의 실수로] 덧셈과 뺄셈으로 곱셈을 (그리고 확실히 나누지 않음) 흉내낼 수 없습니다.

튜링 머신은 인간이 설명 할 수있는 로직이 할 수있는 한도 내에서 실제 숫자로도 이러한 작업을 수행 할 수 있습니다. 튜링 머신은 Rule 110 셀룰러 자동화 만큼 간단 할 수 있습니다 .

트릭은 기계가 가진 물리학에서 논리 시스템을 구축하는 것입니다. 예를 들어, 주류 CPU에는 산술 논리 장치 (ALU) 가 있기 때문에 곱셈과 나눗셈을 수행 할 수 있습니다 . 그러나 ALU는 마법이 아닙니다. 그것들은 단순한 논리 게이트 자체입니다. 그리고 그 논리 게이트는 트랜지스터 로 만들어졌습니다 . 그리고 그 트랜지스터는 도핑 된 모래 로 만들어졌습니다 .

따라서 Turing-complete 장치가 수학을 할 수있게하려면 그렇게 프로그래밍해야합니다.

ππ=0ππππ=0


3

그러나 튜링 완전 언어로 작성된 프로그램을 다른 언어로 다시 작성할 수 있습니까?

프로그램에 대한 입력이 임의의 긴 비트 시퀀스이고 출력이 임의의 긴 비트 시퀀스 인 경우 YES입니다. 다시 작성할 시간과 에너지가 있고 성능에 신경 쓰지 않으며 두 구현 모두에 충분한 물리적 메모리가 있다고 가정하십시오.

두 Turing-complete 언어가 호환되지 않음을 의미하는 실제 고려 사항은 다음과 같습니다.

  • 서로 다른 종류의 입력 및 출력을 지원합니다 (예 : SQL 데이터베이스 액세스)

  • 서로 다른 데이터 유형 라이브러리가 있습니다 (예 : 유니 코드 문자열 지원)

  • 다른 작업에 최적화 된 다양한 프로그래밍 패러다임을 제공합니다 (예 : 객체, 스레드, 코 루틴, 일류 함수)

  • 다른 함수 라이브러리를 제공합니다 (예 : XML 파싱 및 직렬화)


1

제 튜링 완전성과는 아무 상관이없는 프로그램 은 관하여, 수학 함수 (또는 알고리즘 ). 모든 알고리즘-모든 계산 -C로 할 수 있고 다른 Turing-complete 언어로 할 수 있습니다 (이것은 분명해야합니다). 그러나 Turing-completeness가 실제로 I / O를 할 수 있다고 말하는 것은 아닙니다. 하드웨어에 대해서는 전혀 이야기하지 않습니다. 계산 만하면됩니다.

당신은 당신이 원하는 하드웨어 동작 튜링 완전한 언어를 확장 할 수 있습니다 (기술적으로, 이것은 어떻게 fputc하고 fgetc작업 C에서). 두 개의 Turing-complete 언어를 사용하여 동일한 하드웨어 별 작업으로 언어를 확장하면 서로 교환 할 수 있습니다. 따라서 LIGHTBULB작동하는 어셈블리 언어 는 Turing-complete 보다 강력합니다 . 튜링 완료 이상LIGHTBULB 이라고 말할 수 있습니다. 다른 언어를 동일하게 만들려면 Turing-complete 이상이어야합니다 LIGHTBULB. 가장 쉬운 방법은 LIGHTBULB기본 / 명령어 / 함수 등을 추가하는 것입니다.

이것이 C 구현이 일반적으로 인라인 어셈블러를 지원하거나 어셈블러로 작성된 함수를 호출하는 방법을 문서화하는 이유이며, 다른 언어의 구현이 일반적으로 C로 작성된 함수를 호출하는 방법을 제공하는 이유입니다.

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