프로그래밍 언어가 일반적인 재귀 함수를 기본으로 사용합니까?


23

이것은 순진하고 따라서 잘못된 형식의 질문이므로 미리 사과드립니다!

저의 견해는 튜링 머신이 절차 적 / 제 국적 프로그래밍 언어의 계산 기반으로 간주 될 수 있다는 것입니다. 마찬가지로 람다 미적분은 함수형 프로그래밍 언어의 기초입니다.

나는 최근 교회 튜링 논문이 세 번째 계산 모델 인 일반 재귀 함수 와 상호 동등 함을 보여준다는 것을 배웠다 . 이것을 계산 모델로 사용하는 프로그래밍 언어가 있습니까? 그렇지 않은 경우 기술적 인 이유가 있습니까? 즉, "아무도 시도하지 않았다"외에?


1
튜링 머신 또는 범용 레지스터 머신은 프로세서 PL (어셈블리 PL)의 기본이라고합니다. 기능이 없습니다. 재귀 함수는 명령형 PL의 기초입니다. 그들은 고차 기능이 없습니다. μ
beroal

1
나는 또한 1 차 논리와 프롤로그를 살펴볼 것을 권장합니다.
beroal

1
C ++ 11 이전 constexpr에는 컴파일러에서 컴파일 타임에 계산을 수행하기 위해 '템플릿'을 사용할 수있었습니다. 템플릿에 대한 제한은 루프를 허용하지 않지만 재귀를 사용하여 루프를 에뮬레이션 할 수 있으므로 C ++ 언어 표준의 일부로 Turing-complete (메타 프로그래밍) 기능을 사용할 수 있습니다 (예 : stackoverflow.com/questions
JimmyB

답변:


45

질문에 대한 직접적인 대답 : 예, 재귀 함수 (공백 생각)를 기반으로하는 난해하고 비현실적인 PL이 있지만 유효한 이유로 인해 μ 재귀 함수를 기반으로 한 실용적인 프로그래밍 언어는 없습니다 .μμ

일반적인 재귀 (즉, 재귀) 함수는 람다 계산법 보다 표현력 이 현저히 떨어 집니다. 따라서 이들은 프로그래밍 언어의 기초가 열악합니다. 또한 TM이 명령형 PL의 기초라는 점은 정확하지 않습니다. 실제로 우수한 명령형 프로그래밍 언어는 Turing 머신에 비해 λ- 미적분에 훨씬 가깝습니다 .μλ

계산 성 측면에서 재귀 함수, 튜링 머신 및 형식화되지 않은 λ- 미적분은 모두 동일합니다. 그러나 유형화되지 않은 LC에는 다른 두 가지 특성이없는 우수한 특성이 있습니다. 매우 간단하고 (구문 형태 3 개와 계산 규칙 2 개), 구성이 매우 뛰어나며 프로그래밍 구문을 비교적 쉽게 표현할 수 있습니다. 또한, 단순한 타입 시스템을 장착 (예를 들어, 시스템 F는 Ω 으로 확장 f를 내가 X )은 λ -calculus 매우 올바르게와 구조적으로 용이 많은 복잡한 프로그래밍 구조를 발현 할 수 있다는 점에서 표현 될 수있다. λ를 확장 할 수도 있습니다μλFωfixλλ람다가 아닌 구문을 쉽게 포함 할 수 있습니다. 위에서 언급 한 다른 계산 모델 중 어느 것도 당신에게 좋은 속성을 제공하지 않습니다.

튜링 기계는 구성 적이거나 보편적이지 않습니다 (각 문제에 대해 TM이 있어야 함). "함수", "변수"또는 "구성"의 개념은 없습니다. TM이 명령형 PL의 기본이라는 것은 사실도 아닙니다-FWIW, 명령형 PL은 튜링 머신보다 제어 연산자를 가진 람다 계산법에 훨씬 더 가깝습니다. 자세한 설명은 Peter J. Landin의 "ALGOL 60과 교회의 람다 표기법 간의 대응"을 참조하십시오 . Brainf ** k로 프로그래밍 한 경우 (실제로는 단순한 Turing 머신을 구현 함) Turing 머신이 프로그래밍에 적합하지 않다는 것을 알게됩니다.

재귀 함수는 이와 관련하여 TM과 유사합니다. 그것들은 구성 적이지만 LC만큼 구성 적이지는 않습니다. 또한 유용한 프로그래밍 구성을 μ 재귀 함수로인코딩 할 수는 없습니다. 또한 μ- 재귀 함수는 N 이상을 계산하고 다른 모든 것을 계산하려면 괴델 번호 매기기를 사용하여 데이터를 자연수로 인코딩해야합니다. 이는 고통 스럽습니다.μμμN

따라서 대부분의 프로그래밍 언어가 어떻게 든 미적분학을 기반으로한다는 것은 우연의 일치가 아닙니다 ! λ 표현, 구성 성 및 확장 성, 다른 시스템이 부족하다는 : -calculus 좋은 특성을 가지고있다. 그러나 튜링 머신은 계산 복잡성을 연구하는 데 유용하며 μ 재귀 함수는 계산의 논리적 개념을 연구하는 데 유용합니다. 그들은 둘 것을 뛰어난 특성을 가지고 λ -calculus이 부족하다,하지만 프로그래밍 분야에서 λ -calculus 명확하게 승리.λλμλλ

실제로, 더 많은 Turing complete 시스템이 존재하지만, 뛰어난 속성이 부족합니다. Conway의 삶의 게임, LaTeX 매크로 및 심지어 (일부 주장) DNA는 모두 Turing이 완료되었지만 Conway를 사용한 프로그램은 하나도 없으며 (예 : 심각한 프로그래밍) LaTeX 매크로를 사용하여 계산 복잡성을 연구합니다. 그들은 단순히 좋은 속성이 없습니다. 튜링 완료 자체 는 프로그래밍과 관련하여 거의 의미가 없습니다.

또한 많은 비 Turing 완전한 전산 시스템은 프로그래밍에있어 매우 유용합니다. 정규 표현식과 yacc는 Turing이 완전하지는 않지만 특정 클래스의 문제를 해결하는 데 매우 강력합니다. Coq는 Turing complete도 아니지만 믿을 수 없을 정도로 강력합니다 ( Turing Turing 완전 사촌 OCaml보다 훨씬 표현력 이 뛰어납니다). 많은 (가까운) 쓸모없는 시스템이 흥미롭지 않은 Turing 완성이므로 프로그래밍에 관해서는 Turing 완성도가 핵심이 아닙니다. Brainf ** k 또는 Whitespace가 Coq보다 강력한 프로그래밍 언어라고 주장하지 않습니까? 표현 재단은 강력한 프로그래밍 언어의 핵심이며, 현대적인 프로그래밍 언어는 거의 항상 기반으로하는 이유입니다 λ-계산법.


7
"Conway를 가진 어떤 프로그램도 없다"... 일부는 Conway의 삶의 게임에서 Tetris의 작동하는 게임을 빌드합니다 ... 또한 실제로 공백처럼 실용적입니다 :)
Alexei Levenkov

이 볼 수있는 한 가지 방법은 그거 기계를 튜링 시뮬레이트 아마 시뮬레이션하는 튜링 기계보다 훨씬 짧아 질 것이라고 -calculus 기능 λ -calculus (나도 본 적이하지 않는 것이). λλ
문법 철자법

@AlexeiLevenkov 그것은 사실이 아닙니다. 공백은 기본적으로 (단순한) 명령형 언어이지만 이상한 구문이 있습니다. 이 시설이 연산, 기본 제어 흐름, 스택과 힙 조작, I / O를 . 반면에 QFT 프로젝트는 매우 간단한 언어에서 OTCA 메타 픽셀을 사용하여 에뮬레이트 된 Wireworld와 같은 셀룰러 오토 마톤 내에 구축 된 CPU를 위해 작성된 RISC 어셈블리까지 컴파일러를 설계해야했습니다 .
문법 철자법

@AlexeiLevenkov 궁극의 Cogol → CGoL 컴파일러는 4 년 동안 많은 사람들의 작업이 필요 했지만 , HaPyLi 라는 프로젝트가 있는데 , 여가 시간에는 한 사람이 작성했던 훨씬 더 복잡한 언어를 화이트 스페이스로 컴파일합니다.
문법 철자법

4

µ-recursive function programming languageGoogle에 입력 하면 이 GitHub 저장소 로 이동하므로 귀하의 질문에 대한 답변은 다음과 같습니다.

예, 근시 라고합니다

그건 그렇고 하스켈로 작성되었습니다.


μ

2
당연하지. 방금 OP가 이론이나 무언가를 연구하기 위해 그러한 언어를 찾고 싶다고 가정했습니다. 실제로 세상을 정복하지는 않습니다. ;-)
Kapol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.