는 쓸모없는 코드 부분을 삭제할 수 있기 때문에 프로그램 추출에 매우 유용합니다. 예를 들어, 정렬 알고리즘을 추출하기 위해 "모든 목록 ℓ 마다 k 가 정렬되고 k 는 ℓ 의 순열과같은목록 k 가 있습니다"라는 진술을 증명할 수있습니다. 이것을 Coq에 기록하고 P r o p 를 사용하지 않고 추출하면 다음과 같이됩니다.PropℓkkkℓProp
- "모든 에 k가있다 " 는 목록을 목록으로 가져 오는지도 를 제공 합니다.ℓk
sort
- " 가 정렬되도록"은 k를 통과하여 정렬되어 있는지 확인 하는 기능 을 제공합니다.k
verify
k
- " 는 ℓ 의 순열입니다 " 는 ℓ 에서 k 까지 의 순열 을 제공합니다 . 이것은 단지 매핑 일뿐만 아니라, 두 개의 맵이 실제로 역인지 검증하는 프로그램과 함께 역 매핑입니다.kℓ
pi
ℓkpi
여분의 것들이 완전히 쓸모없는 것은 아니지만 많은 응용 프로그램에서 우리는 그것을 없애고 유지하려고 sort
합니다. 이것은 우리가 사용하는 경우 수행 할 수 있습니다 상태 " k는 "주문한 "와 k는 의 순열이다 ℓ "하지만, 하지 "모든 ℓ 가 K ".Propkkℓℓk
일반적으로 코드를 추출하는 일반적인 방법은 ∀ x : A 형식의 문장을 고려하는 것입니다 . 여기서 X , 입력되는 Y를 출력하고, φ ( X , Y는 ) 을 위해 의미 설명 Y는 정확한 출력한다. (위의 예에서및 B는 목록과의 종류 φ ( ℓ , K하는 ) "이고 K는 정렬되고, k는 의 순열 ℓ .")하는 경우 φ이 되어 P의 R O를 P는 다음 추출지도 제공 F를 :∀x:A.∃y:B.ϕ(x,y)xyϕ(x,y)yABϕ(ℓ,k)kkℓϕProp 되도록 φ ( X , F ( X는 ) ) 모두 보유 X ∈ . 경우 φ가 인 S의 전자 t 우리는 또한 함수 얻을 g 되도록 g ( x는 ) 증거가있다 φ ( X , F ( x는 ) ) 모두 보유 X ∈ 을f:A→Bϕ(x,f(x))x∈AϕSetgg(x)ϕ(x,f(x))x∈A. 종종 증명은 계산 상 쓸모가 없으며, 특히 다른 명령문에 깊이 중첩되어있는 경우이를 제거하는 것을 선호합니다. 우리에게 그렇게 할 수있는 가능성을 제공합니다.Prop
2015년 7월 29일 추가 : 우리가 피할 수 있는지 질문이 자동으로 "쓸모 추출 된 코드를"멀리 최적화하여 모두가. 예를 들어, 논리의 부정적 조각 (빈 유형, 단위 유형, 제품으로 작성된 것)에서 추출 된 모든 코드는 단위를 뒤섞는 것처럼 쓸모가 없습니다. 그러나 P r o p 를 사용할 때 반드시 설계 결정을 내려야 합니다. 다음은 간단한 예입니다. Σ 는 우리가 T y p e에 있고 ∃ 는 우리가 P r o p 에 있음을 의미 합니다. 우리가 추출하면
PropPropΣType∃Prop
우리는 n 을 가장 낮은 비트 b 와 나머지 비트 k 로분해하는 프로그램을 얻습니다. 즉, 모든 것을 계산합니다. Π n : N Σ b : { 0 , 1 } ∃ k : N 에서 추출하면
Πn:NΣb:{0,1}Σk:Nn=2⋅k+b
nbk
이면 프로그램은 가장 낮은 비트
b 만 계산합니다. 기계는 어느 것이 올바른지 알 수 없으므로 사용자는 원하는 것을 알려야합니다.
Πn:NΣb:{0,1}∃k:Nn=2⋅k+b
b