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


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의 답변과 반드시 ​​상충되는 것은 아닙니다. 이것은 같은 질문에 대해 생각하는 다른 방법 일뿐입니다.

편집하다:

참고 또한 당신이 정말로 둘 필요가 없습니다 ifwhileC / 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.