전체 기능 프로그래밍의 한계는 무엇입니까?


19

전체 기능 프로그래밍의 한계는 무엇입니까? Turing-complete는 아니지만 가능한 많은 프로그램을 지원합니다. 튜링 완성 언어로 작성할 수 있지만 전체 기능 언어로는 쓸 수없는 중요한 구성 요소가 있습니까?

그리고 전체 기능 언어로 작성된 프로그램은 완전히 정적으로 분석 될 수 있지만 튜링 완료 언어의 정적 분석은 정지 문제와 같은 것들에 의해 제한된다고 말하는 것이 맞습니까? 따라서 전체 기능 언어에서 런타임에만 알려지기 때문에 모든 것이 정적으로 결정될 수는 없지만 이론상 이상적인 전체 기능 프로그래밍 언어로 작성된 프로그램을 분석 할 수 있습니다. 이론적으로 정적으로 결정될 수있다. 정적으로 결정될 수있다. 아니면 정적 분석을 불완전하게 만드는 전체 기능 언어에서 여전히 결정 가능한 문제가 있습니까? 어떤 문제는 어떤 언어로 작성 되었든 항상 결정할 수 없지만, 언어에 상속되는 문제에 관심이 있습니다.

답변:


16

전체 기능 언어 에 따라 다릅니다 .

이 답변은 cop-out처럼 들리지만 더 구체적인 것은 없습니다. 결국, 관심있는 결정 가능한 중요한 프로그램을 고려하십시오. 좋아하는 Turing-complete 언어로 프로그램을 작성하여 해결하십시오. 문제는 결정 가능하기 때문에 모든 입력에서 프로그램이 중지됩니다.

(논리 할 수없는 문제는 흥미로운 프로그램이있을 수 있지만 사람들이 대답을 알기에 충분히 기다릴 수 없기 때문에 사람들이 사용할 수있는 것은 아닙니다.)

이제 하나의 유효한 입력 프로그램, 즉 방금 작성한 프로그램과 같은 의미론을 가지고있는 새 언어를 정의하십시오. 작성된 모든 프로그램에 대한 모든 입력 (하나만 있음)이 항상 종료되기 때문에 확실히 총계입니다.

이 저렴한 트릭은 실제로 유용합니다. 예를 들어, 언어 Coq 는 종료되는 증거가없는 한 프로그램 유형을 검사하지 않는 전체 기능 언어입니다. (해당 요구 사항을 포기하려면 Turing-complete가되므로 종료의 증거를 찾는 것이 유일한 장애물입니다.)

"이론적으로 정적으로 결정될 수있는 모든 것이 정적으로 결정될 수있다"라는 말의 의미가 확실하지 않습니다. 그것은 tautologically 사실처럼 들린다. 그럼에도 불구하고 전체 언어는 본질적으로 분석하기 쉽지 않습니다. 당신은 아무것도 발산하지 않는다는 것을 알고 있습니다. 이것은 유용한 사실이지만, 입력과 출력의 관계는 여전히 복잡합니다. (특히, 여전히 가능한 많은 입력이 있으므로 이론적으로도 모든 입력을 철저하게 시도 할 수는 없습니다.)


답변 주셔서 감사합니다. 따라서 총체가 다소 도움이되지만 여전히 어려운 문제입니다. "이론적으로 정적으로 결정될 수있는 모든 것은 정적으로 결정될 수있다"는 의미는 자원이 충분하다면 입력과 출력 사이의 모든 관계를 분석하는 것이 매우 어렵거나 불가능하다는 것입니다. . 아니면 이것이 제한되는 근본적인 이유입니까? Rice의 정리와 마찬가지로 이것이 부분 기능의 경우임을 증명합니다. 아니면 라이스 정리를 오해하고 있습니까?
Matthijs Steen

"관계"의 의미에 따라 달라질 수 있다고 생각합니다. 특히, "입력 A가 출력 B로 간다"는 것을 의미한다면, 이것은 완전한 기능적 언어로 사소하게 결정될 수 있습니다. 그냥 프로그램을 실행하십시오. 그러나 무한한 입력 클래스에 대해 말하는 분석에 관심이있을 것입니다.
Paul Stansifer

(죄송합니다, 히트 실수로 입력) ...하지만 내가 원한다면 내가 신원 기능에 대한 결정 불가능한 질문을 할 수 있기 때문에이 다른 바보 트릭을 열어 "일부의 경우 X, 인 (identity X)튜링 기계 것을가 정지는?" 물론, 그것은 될 것 같지 않습니다 에 대한 identity ,하지만 당신은 어떻게 "에 대해"정의합니까?
Paul Stansifer

예, 개별 입력이 아닌 일부 정의의 가능한 모든 입력 값을 보유하는지 여부를 알고 싶습니다. 내가 당신을 올바르게 이해한다면, 어떤 종류의 프로그래밍 언어를 사용하든 항상 결정 불가능한 질문이있을 것입니까? 이 결정 불가능한 질문 중 일부는 Halting Problem에 대한 전체 기능 언어와 같이 처음에 문제가 발생하지 않도록하여 우회 할 수 있습니다. 아이덴티티 함수에 대한 당신의 질문이 완전한 기능적 언어로 결정될 수 없기 때문에?
Matthijs Steen

예; "튜링 머신"이 "보증 만료 후 브레이크 다운"으로 대체되는 문제의 수정 된 버전은 사소한 해결이 가능합니다. 프로그램을 검사 할 때 정지 문제가 결정 불가능으로 가득 찬 경우 정지 문제가 결정 불가능한 문제의 예가된다는 점에서 이러한 문제는 번거 롭습니다.
Paul Stansifer

16

전체 기능 프로그래밍의 한계는 무엇입니까? Turing-complete는 아니지만 가능한 많은 프로그램을 지원합니다. 튜링 완성 언어로 작성할 수 있지만 전체 기능 언어로는 쓸 수없는 중요한 구성 요소가 있습니까?

LLL

  1. LLLL일관성이 있습니다. 이것은 산술을 할 수 있다고 가정 할 때 Goedel의 정리가 배제 한 것입니다. 따라서 우리는 완전한 통역 언어로 통역을 작성할 수 없다는 것을 알고 있습니다.

  2. 그러나 이것의 반대 측면은 전체 언어의 표현력에 대한 한계가 본질적으로 수학 자체 의 표현력에 대한 한계라는 입니다. 예를 들어, Coq (증인 보조)에서 정의 할 수있는 기능은 액세스 할 수없는 카디널이 많고 ZFC를 사용하여 계산할 수있는 기능입니다. 따라서 기본적으로 작업 수학자의 만족을 증명할 수있는 모든 기능은 Coq에서 정의 할 수 있습니다.

  3. 플립 측면의 플립 측면은 수학이 어렵다는 것입니다! 따라서 전체 언어를 "완전히 분석 할 수있는"의미는 없습니다. 함수가 종료된다는 것을 알고 있더라도 원하는 속성이 있음을 증명하기 위해 많은 창의적인 작업을 수행해야 할 수도 있습니다. 예를 들어, 목록에서 목록까지의 함수가 총계라는 것을 아는 것만으로도 정렬 함수임을 증명할 수는 없습니다 ...


답변 주셔서 감사합니다. Lambda the Ultimate 웹 블로그 에서이 문제에 대한 게시물을 읽었 지만 의견을 가진 일부 사람들은 자체 평가자를 정기적으로 명시 적으로 구성 가능한 용어로 가질 수는 없지만 작동하는 자체 작성이 가능하다고 말합니다. 몇 가지 트릭을 가진 평가자. 그래서 우회적 인 트릭으로 전체 기능 언어로 해결할 수없는 문제가 있습니까?
Matthijs Steen

자체 평가는 언어에 따라 다르기 때문에 문제로 간주되지 않습니다. "언어 X의 프로그램 평가"문제는 언어 X 또는 Y로 문제를 해결하려고 시도하는지 여부에 관계없이 동일한 문제입니다. 특히 언어 X가 전체 기능 언어 인 경우 일부 전체 기능 언어 에서 문제를 해결할 수 있습니다. 이전에 사용한 것과 같은 바보 같은 속임수를 사용합니다.
Paul Stansifer

Neel, 전체 언어가 자신의 통역사를 지원할 수 없음을 증명하는 것보다 훨씬 쉬워야합니다. 내가 당신을 오해하고 있습니까? 간단한 대각선 화를 통해 고정 소수점이없는 함수가있는 언어는 산술 지원 여부에 관계없이 자체 인터프리터를 지원할 수 없습니다. 논쟁은 Conor McBride에 의해 자세히 설명되어 있습니다 : mail.haskell.org/pipermail/haskell-cafe/2003-May/004343.html
Tom Ellis

@TomEllis : 나의 주장은 본질적으로 Conor와 동일합니다. 사실, 그의 지위는 "Epimenides / Cantor / Russell / Quine / Godel / Turing argument"라고 불렀을 때 이미 Conor의 특징적인 위트를 가지고이 관찰을하고 있습니다.
Neel Krishnaswami
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.