내가 알고 이드리스가 따라 종류가 있지만 완전한 튜링되지 않습니다. Turing 완전성을 포기하면 무엇을 할 수 없으며, 이는 종속 유형을 갖는 것과 관련이 있습니까?
나는 이것이 매우 구체적인 질문이라고 생각하지만 종속 유형 및 관련 유형 시스템에 대해 많은 것을 알지 못합니다.
내가 알고 이드리스가 따라 종류가 있지만 완전한 튜링되지 않습니다. Turing 완전성을 포기하면 무엇을 할 수 없으며, 이는 종속 유형을 갖는 것과 관련이 있습니까?
나는 이것이 매우 구체적인 질문이라고 생각하지만 종속 유형 및 관련 유형 시스템에 대해 많은 것을 알지 못합니다.
답변:
이드리스 튜링 완료! 총체 (데이터로 프로그래밍 할 때 종료, 코 데이터로 프로그래밍 할 때의 생산성)를 확인하지만 모든 것이 전체 일 필요는 없습니다.
흥미롭게도, 부분 함수에 대한 모나드를 작성할 수 있기 때문에 데이터와 코 데이터가 있으면 Turing Completeness 를 모델링 하기에 충분 합니다. 나는 몇 년 전 Coq 에서이 작업을 수행했습니다. 지금은 약간 비틀 렸지만 여기에 있습니다 : http://eb.host.cs.st-andrews.ac.uk/Partial/partial.v .
실제로 그러한 일을 실행하려면 탈출이 필요하지만 Idris는 그렇게 할 수 있습니다.
Idris는 유형 검사를 결정 가능한 상태로 유지하기 위해 유형 수준에서 부분 기능을 줄이지 않습니다. 또한 전체 프로그램 만 합리적으로 증거로 간주 할 수 있습니다.
먼저, 나는 당신이 이미 "계산"이라고 부르는 것은 튜링 머신 (또는 다른 많은 동등한 모델들)로 할 수있는 것이라고 말한 Church-Turing 논문에 대해 들었다고 가정합니다 . 따라서 튜링 완료 언어는 모든 계산을 표현할 수있는 언어입니다. 반대로, 튜링 불완전한 언어는 표현할 수없는 계산이있는 언어입니다.
좋아, 그다지 유익하지 않았습니다. 예를 들어 보겠습니다. 튜링 불완전한 언어로는 할 수없는 일이 있습니다. 튜링 머신 시뮬레이터를 작성할 수 없습니다 (그렇지 않으면 시뮬레이션 된 튜링 머신에서 계산을 인코딩 할 수 있음).
그래, 그것은 여전히 유익하지 않았습니다. 진짜 문제는 튜링 불완전한 언어로 쓸 수 있는 유용한 프로그램은 무엇 입니까? 글쎄, 어느 누구도 누군가가 유용한 목적으로 작성한 모든 프로그램을 포함하고 모든 튜링 머신 계산을 포함하지 않는 "유용한 프로그램"의 정의를 내놓은 사람은 없습니다. 따라서 유용한 프로그램을 모두 작성할 수있는 튜링 불완전한 언어를 디자인하는 것은 여전히 매우 장기적인 연구 목표입니다.
이제 여러 종류의 튜링 불완전한 언어가 있으며, 할 수없는 것과 다릅니다. 그러나 공통 주제가 있습니다. 튜링 완료 언어에는 프로그램 크기에 의해 제한되지 않는 시간 동안 조건부로 종료하거나 계속 진행하는 방법과 프로그램이 입력에 따라 많은 양의 메모리를 사용하는 방법이 포함되어야합니다 . 구체적으로, 가장 필수적인 프로그래밍 언어는 각각 while 루프와 동적 메모리 할당을 통해 이러한 기능을 제공합니다. 대부분의 기능적 프로그래밍 언어는 재귀 및 데이터 구조 중첩을 통해 이러한 기능을 제공합니다.
Idris는 Agda에서 영감을 받았습니다 . Agda는 이론 을 증명 하기 위해 설계된 언어입니다 . 이제 이론 증명과 프로그램 실행은 매우 밀접한 관련 이 있으므로 정리를 증명하는 것처럼 Agda에서 프로그램을 작성할 수 있습니다. 직관적으로 정리의 증명 "A는 B를 암시합니다"는 정리 A의 증거를 인수로 취하고 정리 B의 증거를 반환하는 함수입니다.
시스템의 목표는 정리를 증명하는 것이기 때문에 프로그래머가 임의의 함수를 작성할 수 없습니다. 이 언어가 방금 자체 호출 한 어리석은 재귀 함수를 작성할 수 있다고 상상해보십시오.
oops : A -> B
oops x = oops x
그러한 함수의 존재로 A가 B를 암시한다고 확신시킬 수는 없습니다. 그렇지 않으면 진정한 이론뿐만 아니라 아무것도 증명할 수 있습니다! 따라서 아그 다 (및 유사한 정리 증명 자)는 임의의 재귀를 금지합니다. 재귀 함수를 작성할 때 , 정리 증명 A에서 실행할 때마다 정리 B 증명을 구성 할 것임을 알 수 있도록 항상 종료 함을 증명 해야합니다 .
Agda의 실질적인 한계는 임의의 재귀 함수를 작성할 수 없다는 것입니다. 시스템은 모든 비 종료 기능을 기각 할 수 있어야하므로 정지 문제 (또는 일반적으로 라이스 정리 ) 의 결정 불가능 성으로 인해 기각 된 기능도 종료됩니다. 또 다른 실질적인 어려움은 시스템이 기능이 종료되었음을 증명하도록 도와야한다는 것입니다.
A에서 B까지의 함수가 있다면 A가 B를 암시하는 수학적 증거만큼 우수하다는 보장을 손상시키지 않으면 서 증거 시스템을 프로그래밍 언어와 같은 언어로 만드는 것에 대한 많은 연구가 진행되고 있습니다. 종료 기능은 연구 주제 중 하나입니다. 다른 확장 방향에는 입력 / 출력 및 동시성과 같은 "실제"문제에 대처하는 것이 포함됩니다. 또 다른 과제는 이러한 시스템을 단순한 필사자 만 액세스 할 수있게하는 것입니다 (또는 단순한 필사자에게 실제로 액세스 할 수 있음을 설득하는 것).
나는 Idris에 익숙하지 않습니다. 방금 언급 한 과제를 해결합니다. 2013 preprint 에서 얼핏보기에 Idris 는 Turing-complete이지만 totaler checker를 포함합니다. 전체 검사기는 키워드로 주석이 달린 모든 함수가 total
종료 되는지 확인합니다 . 모든 함수가 총계 인 Idris 프로그램 만 포함하는 언어 조각은 Arda와 표현력이 비슷합니다 (유형 이론의 차이로 인해 정확히 일치하지는 않지만 의도적으로 시도하지 않는 한 눈에 띄지 않을 수 있음).
다른 방식으로 Turing-complete가 아닌 언어의 다른 예는 Coq와 같은 비 turing 완전한 언어의 실제 제한 은 무엇입니까?를 참조하십시오 . (이 답변은 크게 확장 된 것입니다).
sizeof(void*)
)에 내장되어 있기 때문에 C에서는 그렇지 않습니다 . 내 대답에 따르면, 나는 언어를 이상적인 방식으로 취급하므로 SML 또는 C는 Turing-complete로 간주됩니다.