증명과 프로그램 (또는 제안과 유형)의 차이점은 무엇입니까?


26

커리 하워드 통신 이 널리 보급 / 확장 되었다는 점을 감안할 때 증거와 프로그램간에 (또는 제안과 유형간에) 차이가 있습니까? 실제로 식별 할 수 있습니까?



op가 필요하면 @ me 의견을 보내주십시오.

2
[[교정 및 프로그램의 차이점은 무엇입니까?] : 존 크로 슬리는 어디 선가 최근 게시 볼 수 있었던 것을이에 종이를 썼습니다 citeseerx.ist.psu.edu/viewdoc/...은 내가 아직 읽지 못했지만, - 추천되었습니다 ...
TJ Ellis

1
@TJ Ellis, 링크 주셔서 감사합니다. 그러나 잠시 후, 논문이 제목에 제기 된 질문에 답하지 않는 것 같습니다 (또는 답이 "동일합니다").
max taldykin

@TJ Ellis, reddid / r / compsci에 게시 된 것을 보셨습니까? 나는 그것을했다;;) @max, 나는 그렇게 느꼈다. 이것이 내가이 질문을 게시하는 이유이다.

답변:


20

사람들이 매일 사용하는 프로그래밍 언어는 유형 시스템이 너무 약하기 때문에 커리 하워드 통신에 잘 맞지 않습니다. 명령형 프로그램에 Curry-Howard를 사용하여 흥미로운 것을 말하려면 더 복잡한 유형의 시스템이 필요합니다. 프로그램으로 증명 교정 (Aapting Proofs as-programs) 이라는 책 은 명령형 프로그램을 합성하기 위해이 각도를 넓 힙니다 . 연구 기능 언어 ( Agda , Epigram )에서 의존 유형이 점점 더 대중화됨에 따라 구별이 더 모호 해지고 있습니다. 물론 Coq 정리 증명 자 (및 아마도 다른 것) 내에서 프로그램 합성 / 추출을 수행 할 수 있습니다. 물론 Curry-Howard를 기반으로합니다.

Curry-Howard 서신은 증명이 프로그램과 명확하게 일치하지 않는 상황 (또는 다른 사람이 실행할 프로그램이 아닌 경우)에도 사용할 수 있습니다. 이에 대한 한 가지 예는 Proof-carrying authorization 입니다. 제안은 누가 무엇을 할 수있는 권한이 있는지에 대한 진술에 해당합니다. 증거는 제안서에 필요한 증거를 제공하므로 승인 요청이 허용됩니다. 증명을 인코딩하기 위해 증명 용어가 도입되었습니다 (Curry-Howard를 통해). 승인 조건은 권한 부여 요청의 유효성에 대한 증거로 당사자간에 전송되지만 프로그램으로 간주되지는 않습니다.


1
증명과 명제 사이의 경계가 희미 해지면서 의존적으로 입력 된 언어를 언급해야합니다.
Ohad Kammar

1
과연. Coq의 프로그램 합성 / 추출을 잊지 마십시오.
Dave Clarke

어떤 프로그램이 형식의 비 구조적 (클래식) 증명에 해당 합니까? (있다고 가정 몇 가지 흥미로운 decidable 관계 예입니다 에 번째 TM은 정지를 단계). (대답은 매우 짧은 아닌 경우 나는 새로운 문제로 요청할 수 있습니다.)T e kk T(e,k)¬k T(e,k)Tek
카베

1
@Kaveh : 별도의 질문으로 요청하십시오. 코멘트에서 당신은 "고델-젠트 젠 번역은 계속되는 변화입니다"라고 말할 수 있지만 덜 비밀스러운 것은 적합하지 않습니다. :)
Neel Krishnaswami


10

Coq에는 두 가지 유형 (Prop and Set)이 있으며, 실제 코드를 생성하지 않는 증거와 실행 코드 (프로그램)를 추출하는 데 사용할 증거의 일부를 구분하기 위해 프로그래머가이를 사용합니다.

그것은 당신이 묻는 문제, 기계 코드 (프로그램)를 생성하는 것이 무엇인지, 제안 (또는 유형)의 증거를 완성하기 위해 존재하는 것을 식별하는 방법에 대한 좋은 해결책입니다.

AFAIK는 두 가지를 자동으로 구분할 수있는 방법이 없습니다. 이것은 연구에 흥미로운 것일까 요? 아니면 누군가가 분명히 불가능하다고 지적 할 수 있습니까?

종속 형식을 사용하면 증명과 프로그램간에 명확한 구분이있을뿐만 아니라 프로그램과 형식 간에도 구분이 없습니다! 유일하게 구별되는 것은 유형 (또는 프로그램)이 나타나는 위치이며, 주어진 용어의 "프로그램"장소 또는 "유형"장소의 일부가됩니다.

예를 들어 내가 희망하는 것을 분명히 할 것입니다.

종속 유형으로 항등 함수를 사용하는 경우 함수를 사용할 유형을 전달해야합니다! 이 유형은 "프로그램"에서 값으로 사용됩니다!

형식화되지 않은 Lambda 미적분학 :

id =λx.x

종속 유형으로 :

id : (A : 설정)-> A-> A

id =(λA.(λx.x))

이 기능을 사용하는 경우 다음 예제와 같이 수행하십시오.

아이디 내추럴 1

값으로 전달되는 "type"(이 경우 Set of Naturals)은 버려 지므로 계산되지는 않지만 용어의 "프로그램"부분에 있습니다. 그것이 "증거 된"부분에서도 일어날 일이며, 타입 검사를 위해 용어가 있어야하지만 계산 중에는 버려 질 것입니다.


6

나는 여기서 사지로 나가서 조금만 기꺼이 말하면 증거와 종료 프로그램을 식별 할 수 있다고 말합니다 .

모든 종료 프로그램은 입력을 받고 출력을 생성 할 수 있다는 증거입니다. 이것은 매우 기본적인 의미의 증거입니다.

물론, 이러한 의미가 명백한 것보다 정보를 더 의미있게 전달하기 위해서는 프로그램이 논리적으로 의미가있는 클래스에서 입력 된 모든 인스턴스에 대해 작동 함을 보여줄 수 있어야합니다. (그리고 출력도 마찬가지입니다.)

다른 방향에서, 유한 추론 단계를 가진 증거는 일부 논리 시스템에서 객체를 조작하는 상징적 프로그램입니다. (논리적 기호와 규칙이 계산 상 의미하는 것에 대해 너무 걱정하지 않으면.)

유형과 제안이 비슷하게 작동하도록 만들 수 있습니다. 모든 유형 T 에는 명백한 진실 조건을 가진 제안이 할당 될 수 있습니다 . 모든 제안은 증거의 유형으로 전환 될 수 있습니다.x:xT

이것은 매우 단순하지만 아이디어의 견고성을 암시한다고 생각합니다. (일부 사람들이 그것을 좋아하지 않는 경우에도. ;-))


아주 좋은 답변입니다.
toto

물론 당신은 유한 한 증거와 종료 프로그램 을 의미한다고 가정해야 합니다. 종료하지 않는 프로그램의 일부 클래스는 무한한 증거처럼 잘 작동합니다. 비생산적인 비 종료 프로그램입니다.
렌 로마노

증거와 관련하여 유한하고 무한한 정의 방법에 따라 약간 까다 롭습니다. 일반적으로, 우리가 받아들이는 모든 증거는 유한합니다. 왜냐하면 그들은 짧은 시간 안에 인간을 납득시켜야하기 때문입니다. 유도 체계 (즉, 대부분의 "무한"증명)에 의존하는 증명은이 측정법에 의해 여전히 유한하며, 무한하지만 규칙적인 계산을 나타내는 상징적 단계 만 있습니다. 우리 대부분이 유효한 증거로 기각한다고 생각하는 진정으로 무한한 증거는 문자 그대로 검증 할 무한한 수의 고유 한 사실을 고려해야하는 곳입니다.
Marc Hamann

5

증거 관련성이 없습니까?

일부 프로그램을 작성할 때 성능, 메모리 소비 등에 관심이 있습니다.
예를 들어, 구현이 동일한 유형 (종속 유형 설정에서도)을 갖더라도 버블 정렬 대신 영리한 정렬 알고리즘을 사용하는 것이 좋습니다.

그러나 당신이 어떤 정리를 증명할 때 그것은 당신이 관심있는 증거의 존재 일뿐입니다.

물론 미학적 관점에서 볼 때 일부 증거는 더 단순하고 아름답고 고무적입니다 (예 : The Book의 증거).


4

Curry-Howard 서신을 받아들이면 그 문제는 주로 철학적 인 것입니다. "증명서와 프로그램이 다른가? 물론. 어떻게? 어떻게 우리는 증명을 '증명서'라고 부르고 프로그램을 '프로그램'이라고 부른다."

또는 증거와 프로그램 사이에 동형이 존재하는 경우 (확실히있는 것처럼 보이지만) 두 가지를 구별 할 수있는 오라클이 있는지 묻는 질문이 있습니다. 인간은 그것들을 (대부분의) 다른 것으로 분류하기 때문에 그러한 오라클이 존재한다는 것은 틀림 없습니다. 중요한 질문 은 그들 사이에 의미있는 차이 가 있는지의 여부가되고 , 이는 철학적 토론에 달려 있습니다. "증거"란 무엇입니까? 증거를 구성하는 것에 대한 공식적인 정의는 없습니다. 그것은 교회에서 "효과적으로 계산할 수있는"이라는 개념과 비슷한 예술 용어입니다. 그 문제에 대해 "프로그램"에는 공식적인 정의도 없습니다.

이들은 수학 탐구의 다른 분야를 분류하는 데 사용되는 자연어의 단어입니다. Curry와 Howard는이 두 가지 분야에서 실제로 같은 것을 연구하고 있다는 사실을 관찰했습니다. 이 서로 다른 연구자들이 서로 대화해야한다고 말했기 때문에이 연결에 주목하는 것이 중요합니다. 그러나 다른 차원에서, 연결을 주목하는 것은 그들 사이의 차이를 믿는 것입니다. 문제를 해결할 때, 때로는 문제를 프로그래밍 문제로 생각하는 것이 더 유리한 반면, 다른 문제는 논리 문제로 생각하는 것이 더 유리합니다. 이 관점의 차이는 그들 사이의 중요한 차이점이라고 생각합니다. 그러나 원근의 차이가 정체성의 차이를 구성하는지 여부는 Frege 's에 이르기까지 최소한 탐구 된 깊은 철학적 질문입니다.Ueber Sinn과 Bedeutung .

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