튜링이 완료되는 프로그래밍 언어에 대한 최소 기준이 있습니까?


55

Turing Complete로 간주되기 위해 프로그래밍 언어로 된 프로그래밍 언어 구문 세트가 있습니까?

wikipedia 에서 알 수 있듯이 언어는 재귀를 지원해야하거나 중단없이 실행할 수 있어야합니다. 이것이 전부입니까?


6
아마도 귀하의 질문은 "최소한 프로그래밍 구성 요소가 있습니까?"라고 묻어 야합니다. 그 답은 "모든 계산 가능한 구성 요소"입니다.
— Dave Clarke


@DaveClarke, 감사합니다, 나는 그것을 업데이트했습니다. 귀하의 의견은 언어가 열악하기 때문이라고 생각하지만 질문을 다소 제기합니다. 언어가 계산할 수 있다면 그에 상응하는 작업이 몇 가지 있는지 묻고 자했습니다.
— 칸 조르

답변:


45

나는 항상 그 재귀 함수 가 그것을 못 박았습니다. 다음은 계산 가능한 전체 기능을 정의하는 것입니다. resp를 포함하는 가장 작은 함수 집합입니다. 폐쇄 :μ

  1. 상수 기능0
  2. 후속 기능
  3. 매개 변수 선택
  4. 기능 구성
  5. 원시 재귀
  6. -operator (최소 찾는다 같은 ... 해당)μx

자세한 내용은 위의 링크를 확인하십시오. 매우 컴팩트 한 프로그래밍 언어를 만듭니다. 또한 무료 점심 식사없이 프로그램하는 것도 끔찍합니다. 그중 하나를 떨어 뜨리면 최대 전력을 잃게되므로 최소한의 공리입니다.

당신은 기본적인 구문 요소로 말 그대로 사람들을 번역 할 수 있습니다 WHILE 프로그램 즉,

  1. 상수 0
  2. 증분 _ + 1
  3. 가변 액세스 x
  4. 프로그램 / 상태 연결 _; _
  5. 카운트 다운 루프 for ( x to 0 ) do _ end
  6. while 루프 while ( x != 0 ) do _ end

1
나는 당신 이 언어로 5 번째 규칙을 버릴 수 없다는 것이 명백하다고 생각합니다 . while6 의 루프는 상수 0과 비교하기 때문에 변수는 규칙 2에 의해서만 증가 할 수 있으며 시작할 음의 상수는 없습니다 (규칙 1). while6 의 루프는 입력되지 않거나 (x = 0) 무한대입니다 ( x> 0이고 루프 본문은 줄일 수 없습니다.)
— MSalters

1
@MSalters 당신이 옳다고 생각합니다; 내가 생각했던 시뮬레이션을 위해, 우리는 필요 _ - 1하고 그것을없이 구현할 방법을 생각할 수 없다 for. 그것을 잡아 주셔서 감사합니다! (더 나은 _ - 1또는 for무엇입니까
— 라파엘

20

Turing Complete로 간주 되려면 프로그래밍 언어로 수행 할 수있는 일련의 계산이 있습니까?

예, Turing을 완료하기 위해서는 프로그래밍 언어가 Turing 기계가 수행 할 수있는 모든 계산을 수행 할 수 있어야합니다. 따라서 최소한의 요구 사항에 따라 범용 Turing 기계 또는 다른 Turing 완전한 언어의 통역사를 구현할 수 있어야합니다.

Wikipedia에서 알 수 있듯이 언어는 재귀를 지원해야하거나 중단없이 실행할 수 있어야합니다. 이것이 전부입니까?

예를 들어 유일하게 허용되는 연산이 재귀 인 언어 (예 : 쓸 수있는 유일한 기능은) f(x) = f(x), 튜링이 완료되지 않은 프로그램이기 때문에 튜링이 완료되지 않은 것입니다. 튜링 머신이 수행 할 수있는 모든 계산을 구현할 수 있어야하므로 충분하지 않습니다.

또한 언어는 생각하는 방식으로 재귀를 지원하지 않아도됩니다. 루프를 표현하는 방법은 제한이 없습니다. 그것은 재귀 일 수도 있지만 while 루프 나 goto 일 수도 있습니다. 전혀 기능이없는 언어는 여전히 튜링 완료일 수 있습니다. 그리고 다시 루프 또는 재귀 함수는 충분한 조건이 아닙니다. 조건에 따라 다른 코드를 실행하는 방법과 이전 값에서 새로운 값을 계산하는 방법이 필요합니다 (그렇지 않으면 모든 루프 / 재귀는 무한하거나 전혀 실행되지 않습니다).


이러한 작업을 지원하는 모든 언어가 Turing complete이고 그렇지 않은 언어와 같이 최소한의 필요하고 충분한 작업이 있는지 여부에 대해서는 그렇지 않습니다. 아니요, "operation"을 모호하게 정의하지 않는 한 없습니다. 의미가 없어짐) :

예를 들어, 이미 말했듯이 재귀 함수 (또는 모든 함수)를 지원하지 않는 Turing 완전한 언어가 있습니다. goto명령문이나 while루프가 있고 임의의 양의 데이터를 저장하는 방법 이 있으면 여전히 튜링 완료 상태 일 수 있습니다 . 그러나 재귀 기능을 가진 언어는 튜링을 완성 할 필요도 while없습니다 goto. 따라서 goto필요한 충분한 작업 세트가 아니지만을 제거하면 더 이상 Turing이 완료되지 않은 언어가 있습니다 goto. 따라서 그러한 세트는 없습니다.


내가 확신하지 못하는 유일한 부분은 필요한 최소한의 작업에 대한 귀하의 답변입니다. 귀하는 운영에 대한 정의를 요청 된 것보다 훨씬 더 좁은 범위 인 제어 구조 로 제한 하는 것 같으며, "그들이 모호하게"무의미 해 지도록 "정의하지 않아야한다는 자신의 요구 사항을 넘어서고 있습니다.
— Joshua Drake

@JoshuaDrake 무슨 말인지 잘 모르겠습니다. 구조를 제어하는 ​​작업을 제한하지 않습니다. 카운터 예제에서 구조를 제어하지 않는 작업에 대해서는 이야기와 관련이 없기 때문에 설명하지 않습니다. 실제로 나는 "임의의 양의 데이터를 저장하는 방법"에 대해 언급합니다. 그것은 제어 구조가 아닙니다.
— sepp2k

일부 언어는 튜링 완전성을 지원 goto하지만 일부 언어는 튜링 완전성을 지원 하지 않으며 일부 언어는 튜링 완전성을 goto위해 필요한 일련의 작업의 일부가 될 수 없다고 주장합니다 . 제 요점은 goto단순히 점프와 같은보다 일반적인 작업을 구현하는 구문적인 방법입니다. 따라서 특정 제어 구조에서 간단히 추상화하면 최소한 튜링 완전성을 향한 일련의 작업에 더 가까이 갈 것이라고 믿습니다.
— Joshua Drake

@JoshuaDrake goto 대신 "jump"를 사용한다고 생각하지 않아도 충분하고 필요한 작업 집합을 정의 할 수 있습니다. 모든 언어에 일종의 점프 작업이 필요하고 함수 호출 만 필요한 경우에는 추가 작업을 수행 할 수 있다고 생각하지 않습니다. 예를 들어 람다 미적분학에는 응용 (즉, 점프 연산)과 추상화 (즉, 함수 생성)라는 두 가지 연산이 있습니다.
— sepp2k

1
@JoshuaDrake 나는이 기사가 Turing-complete 언어가 그 작업을 필요로한다고 주장하지는 않는다고 생각한다. 특히이 문장을 절차 적 언어로 제한하기 때문입니다. Lambda 미적분학에는 goto (예 : 함수 응용 프로그램)의 형태를 제외하고는 그러한 것이 없습니다. 여기서 "최소한"이란 그 기능 만있는 언어에서는 튜링 완전성을 잃지 않고는 그 기능을 제거 할 수 없다는 것을 의미합니다. Turing 완전성에 충분한 다른 최소 작업 집합이 없다는 것은 아닙니다.
— sepp2k

14

Turing 완전한 언어로 이끄는 다양한 단일 지시 사항이 있습니다. 일반적인 예는 "제로인 경우 빼기 및 분기"입니다. 이들은 어셈블리 언어 프로그래밍과 관련하여 잘 알려져 있습니다. 자세한 내용 은 Wikipedia 기사 를 참조하십시오.

이것은 특성화로 이어진다 : 언어는 메모리에서 정수를 가져오고 저장하고 "제로인 경우 빼기 및 분기"연산을 수행하는 작업을 시뮬레이션 할 수있는 경우에만 튜링이 완료된다.


13

이것은 귀하의 질문에 대한 일반적인 대답은 아니지만 구조적 프로그래밍 정리에 따르면 선택 (예 : ifC / C ++) 및 반복 (예 : whileC / C ++) 기능이 필요합니다. 편집 : 의견에서 Dave Clarke이 지적했듯이 구조적 프로그래밍 정리에는 시퀀스가 ​​필요합니다. 독자가 나중에 메모리 저장소에서 읽고 쓰는 등의 다른 명령의 기본 블록도 필요하다는 것을 이해할 것이므로 당연히 이것을 열거하지 않았습니다. 물론 명시 적으로하는 것이 좋습니다. 이것들도 할 수 있어야합니다.

이 두 가지 모두 조건부 점프 명령 (예 : JNZx86)을 사용하여 구현할 수 있기 때문에 Turing-equivalence에도 충분합니다.

다른 것, 즉 무한한 수의 심볼 (예를 들어, 비트 ... 0 또는 1)을 일종의 외부 메모리 저장소에 쓰는 기능이 필요합니다. 그런 의미에서 실제 컴퓨터는 스토리지 용량이 무한하므로 튜링과 동등하지 않습니다. 튜링 모델은 여전히 ​​메모리의 양이 많기 때문에 여전히 유용하며 실제 컴퓨터가 해결할 수있는 문제가 결정 론적 유한 오토 마톤으로 해결할 수는 있지만 그 계산 모델을 사용하는 것은 특히 유용하지 않습니다. 국가의 수는 엄청나게 클 것이다).

이것이 sepp2k의 답변과 반드시 ​​상충되는 것은 아닙니다. 이것은 같은 질문에 대해 생각하는 다른 방법 일뿐입니다.

편집하다:

참고 또한 당신이 정말로 둘 필요가 없습니다 if및 whileC / C ++에 있습니다. 다음과 같이 if사용하여 시뮬레이션 할 수 있습니다 while.

bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program

다음 코드는 항상 동일합니다.

bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program

글쎄 ... 건설은 잘되어야하고 조심한다면 가능할 것입니다. 재귀 함수가있는 경우 결국에는 선택도 필요합니다. 선택하지 않은 재귀 함수는 실제로 기본 사례를 구현할 수 없으므로 재귀 함수는 무한 재귀를 초래합니다.

편집하다:

또한 중단되지 않는 프로그램을 작성할 수있는 능력이 Turing 동등성에 충분한 지 여부에 대한 귀하의 질문에 대한 답은 "아니오"입니다. 필요하지만 충분하지 않습니다. 중단되지 않는 프로그램을 표현할 수없는 언어로 작성된 프로그램의 정지 문제를 해결할 수 있습니다. 답은 모든 프로그램에 대해 "프로그램이 중지됩니다"입니다. 그러나 유일한 명령어로 인해 기계가 무한 루프에 들어가는 언어를 정의 할 수 있습니다. 이러한 언어는 튜링과 동일하지 않습니다.


13

연결자 와 여기서, 및 는 (닫힌) 람다 항을 나타내기에 충분하므로 계산 가능한 함수입니다. 자세한 내용은이 위키 백과 페이지 를 참조하십시오.K ( S x y z ) = ( x z ( y z ) ) ( K x y ) = xSK(S x y z)=(x z (y z))(K x y)=x

실제로 람다 용어 는 모든 람다 용어를 표현하기에 충분한 기초입니다. 같은 위키 백과 페이지 에서 나중에 참조 하십시오 .X=λx.((x S) K)


5

언어 구성은 상호 교환 가능합니다

프로그래밍 언어에서 기본적 으로 제공 해야하는 구문에 대한 최소 기준은 설정되어 있지 않습니다 . 그것이 튜링-완전 시스템을 표현하기 위해 어떻게 든 복잡 할 수있는 이상한 구성을 제공한다면, 그 구성은 다른 구성 요소와 마찬가지로 "적절한"것입니다.

이를 증명하기 위해- "제로인 경우 빼기 및 분기"작업 만 제공하는 언어입니다 . 별도의 "제로인 경우 빼기 및 분기"구성을 제공하지 않는 튜링 완성 언어가 있으며, 구성 또는 필수 구성 집합이 없습니다.

TP 완료 언어 구성의 효과는 다른 TP 완료 언어의 구성으로 모방 할 수 있습니다.

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