튜링의 완전성을 포기하면 이드리스가 무엇을 할 수 없습니까?


35

내가 알고 이드리스가 따라 종류가 있지만 완전한 튜링되지 않습니다. Turing 완전성을 포기하면 무엇을 할 수 없으며, 이는 종속 유형을 갖는 것과 관련이 있습니까?

나는 이것이 매우 구체적인 질문이라고 생각하지만 종속 유형 및 관련 유형 시스템에 대해 많은 것을 알지 못합니다.


2
구체적인 예를 찾고 있다고 생각하십니까? 나는 Idris에 익숙하지 않지만 Isabelle / HOL에서는 항상 종료되지 않는 함수를 작성할 수 없습니다 (심지어 종료 증거 를 제공해야합니다 ).
Raphael

이 라인을 따라 뭔가 예-유형 시스템에서 특정 속성을 가진 언어를 인코딩 할 수 없거나 좀 더 일반적인지 여부와 같이 꽤 틈새 사례가 있는지 확실하지 않습니다 (예 : 말한 것처럼) , 모든 기능이 종료 된 것으로 입증되어야합니다.)
Squidly

1
이 잘못된 가정은 에드윈 브래디 (Edwin Brady)가 Idris가 "Pacman complete"라고 말한 것으로 추측합니다. "Turing complete"대신 "Pacman complete"라고 말하면 그의 주요 요점은 기계뿐만 아니라 인간의 두뇌가 쉽게 컴파일 할 수있는 언어의 중요성을 강조하고 싶다는 것입니다. BrainFuck과 같은 어리석은 언어는 확실히 튜링은 완료되었지만, BrainFuck으로 작성된 코드를 이해하기 위해서는 인간의 두뇌가 꽤 오래 걸릴 수 있습니다. 따라서 BrainFuck 의 Pacman 프로그램 을 개발하고 더욱 유지 관리 하는 데 상당한 노력이 필요합니다.
Michelrandahl

@Mitzh 실제로는 아닙니다. 나는 그가 대화에서 그가들은 말을 오해했기 때문이라고 생각합니다.
오징어

답변:


50

이드리스 튜링 완료! 총체 (데이터로 프로그래밍 할 때 종료, 코 데이터로 프로그래밍 할 때의 생산성)를 확인하지만 모든 것이 전체 일 필요는 없습니다.

흥미롭게도, 부분 함수에 대한 모나드를 작성할 수 있기 때문에 데이터와 코 데이터가 있으면 Turing Completeness 를 모델링 하기에 충분 합니다. 나는 몇 년 전 Coq 에서이 작업을 수행했습니다. 지금은 약간 비틀 렸지만 여기에 있습니다 : http://eb.host.cs.st-andrews.ac.uk/Partial/partial.v .

실제로 그러한 일을 실행하려면 탈출이 필요하지만 Idris는 그렇게 할 수 있습니다.

Idris는 유형 검사를 결정 가능한 상태로 유지하기 위해 유형 수준에서 부분 기능을 줄이지 않습니다. 또한 전체 프로그램 만 합리적으로 증거로 간주 할 수 있습니다.


4
남자 자신. 이 맥락에서 생산성은 무엇입니까?
오징어

5
이중에서 종료 : 귀납적 정의는 (모든 데이터를 소비함으로써) 종료되어야하지만, 동시성 정의는 생산적이어야합니다. 실제로 이것은 재귀 호출이 생성자에 의해 보호되어야한다는 것을 의미합니다. 이 설명이 가장 분명한 것으로 나타났습니다 (ymmv) : adam.chlipala.net/cpdt/html/Coinductive.html
Edwin Brady

14

먼저, 나는 당신이 이미 "계산"이라고 부르는 것은 튜링 머신 (또는 다른 많은 동등한 모델들)로 할 수있는 것이라고 말한 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 완전한 언어의 실제 제한무엇입니까?를 참조하십시오 . (이 답변은 크게 확장 된 것입니다).


3
" 튜링 불완전한 언어로 쓸 수 있는 유용한 프로그램은 무엇 입니까?" 자바 가상 머신.
David Richerby

@DavidRicherby 당신은 할 수 없습니까? JVM이 실제로 Turing-complete입니까? 개별 객체의 크기에는 제한이 있습니다. 무제한의 객체를 할당하고 액세스 할 수 있습니까? 예를 들어 C에서는 포인터 값이 유한하게 많기 때문에 대답이 '아니오'인 것 같습니다 .
Gilles 'SO- 악마 그만'

그 부분에 관심이있는 독자들을 위해, 항상 끝나는 언어를위한 프로그래밍 언어가없는 이유에 대한 또 다른 게시물 이 있습니다.
Raphael

3
@Gilles 나는 당신의 요점을 취하지 만 실제 프로그래밍 언어가 Turing-complete가 아니라고 말하는 것과 다소 같지 않습니까? 결국, 모든 구현은 언급 한 종류의 장벽에 부딪 칠 것입니다. Idris가 Turing-complete가 아닌 것으로 잃어버린 것을 고려하면서 방에 가지고있는 꽤 큰 코끼리처럼 보입니다. 예를 들어 다른 언어보다 더 많이 잃어 버립니까? 무제한 외부 저장 장치 (예 : "다음 / 이전 디스크를 삽입하십시오"라고 말하는 프로그램을 중지)를 금지하면 모든 언어가 튜링 완료가 아니므로 해당 사례에 대한 의문이 모호합니다.
David Richerby

3
@DavidRicherby 내 의견은 (내 대답은 아님) 프로그래밍 언어 이론 괴짜 모드에 있습니다. 예를 들어 SML의 공식 사양을 사용하는 경우 모든 계산 가능한 프로그램을 시뮬레이션 할 수있는 언어 구현을 디자인 할 수 있습니다 (물론 실제 구현은 아님). 메모리의 유한함이 언어 ( sizeof(void*))에 내장되어 있기 때문에 C에서는 그렇지 않습니다 . 내 대답에 따르면, 나는 언어를 이상적인 방식으로 취급하므로 SML 또는 C는 Turing-complete로 간주됩니다.
Gilles 'SO- 악마 그만'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.