효율적인 계산을위한 프로그래밍 언어


32

모든 입력을 멈추고 다른 입력을 멈추는 모든 기계를 허용하는 프로그래밍 언어를 작성하는 것은 불가능합니다. 그러나 표준 복잡성 클래스에 대해 이러한 프로그래밍 언어를 쉽게 정의 할 수 있습니다. 특히 모든 효율적인 계산과 효율적인 계산 만 표현할 수있는 언어를 정의 할 수 있습니다.

예를 들어, 와 같은 경우 : 좋아하는 프로그래밍 언어를 취하고 프로그램을 작성한 후 (Turing Machine M '에 해당 ) 정수 c 및 정수 k 및 기본 출력 d 3을 헤더에 추가하십시오 . 프로그램이 컴파일되면 출력 튜링 기계 M 입력 주어진 X 사이즈 N 실행 M을 'XC N K 단계. 경우 M은 ' 전과 중단없는 C N KPMckdMxnMxcnkMcnk단계가 완료되면 기본 출력 출력하십시오 . 내가 실수하지 않는 한,이 프로그래밍 언어를 사용하면 모든 계산을 P 로 표현할 수 있습니다. 그러나이 제안 된 언어는 본질적으로 흥미롭지 않습니다.dP

내 질문 : 계산 가능한 기능 (예 : 효율적으로 계산 가능한 모든 기능)의 하위 집합을 사소한 방식으로 캡처하는 프로그래밍 언어가 있습니까? 없는 경우, 그 이유가 있습니까?


7
계산 가능한 함수의 하위 집합 인 정규식 및 컨텍스트없는 문법을 캡처하는 프로그래밍 언어의 간단한 예입니다.
Jukka Suomela

2
실제로 P V 와 같은 복잡성 클래스 를 캡처하는 언어 (재귀가 경계 재귀로 대체 된 기본 재귀 함수와 유사한 방식으로 정의 됨)는 (적어도 이론적 인 관점에서) 매우 흥미 롭습니다. :)PPV
Kaveh

선형 및 정수 프로그래밍은 계산 가능한 함수의 흥미로운 서브 세트를 캡처합니다.
Diego de Estrada

데이터 로그는 다항식 시간 알고리즘 만 표현할 수 있지만 모든 다항식 시간 알고리즘을 표현할 수 있는지는 알 수 없습니다.
Jules

잘 알려진 논문 "Total Functional Programming"은 결정 불가능한 정지 문제가없는 프로그래밍 언어가 실제로 실용적이고 유용하다는 주장을합니다. jucs.org/jucs_10_7/total_functional_programming
none

답변:


32

다항식 시간 계산 만 표현하려는 언어 중 하나는 소프트 람다 미적분 입니다. 형식 시스템은 선형 논리에 뿌리를두고 있습니다. 최근 논문 은 다항식 시간 계산법을 다루고 있으며이 접근법을 기반으로 한 최근 개발에 대한 요약을 제공합니다. Martin Hofmann은이 주제에 대해 꽤 오랫동안 연구 해 왔습니다. 더 오래된 관련 논문 목록은 여기 에서 찾을 수 있습니다 . 그의 논문 중 많은 부분 이이 방향으로 계속되고 있습니다.

다른 작업은 프로그램이 종속 유형 또는 유형이 지정된 어셈블리 언어를 사용하여 프로그램이 특정 양의 자원을 사용하는지 확인하는 접근 방식을 취합니다 .

또 다른 접근 방식은 주변 미적분의 변형과 같은 자원 경계 공식 미적분학을 기반으로 합니다 .

이러한 접근 방식은 유형이 잘 지정된 프로그램이 미리 지정된 일부 자원 범위를 만족시키는 특성을 가지고 있습니다. 자원 바운드는 시간 또는 공간 일 수 있으며 일반적으로 입력 크기에 따라 달라질 수 있습니다.

이 분야의 초기 연구는 미적분학을 강력하게 정규화하는 것입니다. 즉, 모든 유형이 잘 지정된 프로그램이 중단됩니다. 다형성 람다 미적분학으로 불리는 시스템 F 는 강하게 정규화되고있다. 고정 소수점 연산자는 없지만 그럼에도 불구하고 표현력이 뛰어나지 만 복잡한 클래스가 무엇인지 알 수는 없습니다. 정의에 따르면, 강력하게 정규화되는 미적분은 종료 계산의 일부 클래스를 나타냅니다.

프로그래밍 언어 자선 은 모든 표현에서 멈추는 표현력이 뛰어난 기능 언어입니다. 어떤 복잡한 클래스를 표현할 수 있는지는 모르겠지만 Ackermann 함수는 Charity로 작성할 수 있습니다.


여기서 '적어도'는 무슨 뜻입니까?
nponeccop

여기서 '적어도'는 '일부'를 의미합니다. 좀 더 정확하게 답변을 변경하겠습니다.
Dave Clarke

시스템 F에서 정의 할 수있는 함수의 복잡성은 입력의 "제 2 차 산술의 일부 함수일 수있다"는 시간에 종료되는 함수 클래스라고 확신합니다. 매우 전통적인 복잡성 클래스는 아니지만 여전히 ...
cody

코디 : Wadler의 "무료 정리"에 따르면, 시스템 F는 "2 차 Peano 산술에서 전체적으로 증명 될 수있는 모든 재귀 함수"를 표현할 수 있으며 "[...] Ackermann 함수를 포함합니다". 그것이 당신이 묘사 한 것과 같은지 확실하지 않습니다. Charity의 주요 기능은 codata 지원이며, Agda의 종료 검사는 종료를 보장하면서 Coq 및 System F보다 표현력이 더 우수하다고 생각합니다.
Blaisorblade


8

또한 암시 적 복잡성 이론을 이것에 대한 접근 방식으로 언급하고 싶습니다. Neel Krishnaswami의이 답변 을 인용하려면 :

기본 기술은 복잡성 클래스를 선형 논리의 서브 시스템 (소위 "경량 선형 논리")과 연관시키고 논리 시스템에 대한 컷 제거가 주어진 복잡성 클래스 (LOGSPACE, PTIME 등). 그런 다음 Curry-Howard를 통해 주어진 클래스의 프로그램을 정확하게 표현할 수있는 프로그래밍 언어를 얻을 수 있습니다.


5

아무도 원시 재귀에 대해 언급하지 않은 것에 놀랐습니다. 경계 루프로 제한함으로써 (즉, 루프가 시작되기 전에 각 루프에 대한 반복 횟수를 계산해야 함) 결과 프로그램은 원시 재귀이므로 총계입니다. Douglas Hofstadter는 원시 재귀 함수를 모두 허용하는 프로그래밍 언어 BLOOP를 제안했습니다.


1
모든 함수의 적절한 서브 클래스이지만 "효율적인"함수의 클래스로 부르는 것은 약간의 확장 일 수 있습니다.
Raphael

캡처하도록 수정할 수 있다고 생각합니다. Cobham의 특성을 사용하여 다항식 경계 재귀로.
Kaveh

다른 사람들은 System F와 다른 정규화 된 언어를 언급했는데, 이는 어떤 의미에서는 "원시 재귀"만 지원합니다. 그러나 일류 함수를 지원하므로 Ackermann 함수와 같은 더 많은 프로그램을 작성할 수 있습니다.
Blaisorblade

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