rất hữu ích để trích xuất chương trình vì nó cho phép chúng ta xóa các phần mã vô dụng. Ví dụ, để trích xuất một thuật toán sắp xếp chúng tôi sẽ chứng minh các tuyên bố "cho mọi danh sách ℓ có một danh sách k mà k được ra lệnh và k là một permutatiom của ℓ ". Nếu chúng ta viết điều này xuống Coq và giải nén mà không sử dụng P r o p , chúng ta sẽ nhận được:P r o pℓkkkℓP r o p
- "cho tất cả có k " sẽ cho chúng ta một bản đồ mà mất danh sách các danh sách,ℓk
sort
- "sao cho được ra lệnh" sẽ đưa ra một funciton chạy qua k và kiểm tra xem nó đã được sắp xếp chưa, vàk
verify
k
- " là hoán vị của ℓ " sẽ cho phép hoán vị mất ℓ đến k . Lưu ý rằng đó không chỉ là ánh xạ, mà còn là ánh xạ ngược cùng với các chương trình xác minh rằng hai bản đồ thực sự là nghịch đảo.kℓ
pi
ℓkpi
Mặc dù các công cụ bổ sung không hoàn toàn vô dụng, nhưng trong nhiều ứng dụng, chúng tôi muốn loại bỏ nó và giữ lại sort
. Điều này có thể được thực hiện nếu chúng ta sử dụng trạng thái " k được ra lệnh" và " k là một hoán vị của ℓ ", nhưng không "cho tất cả ℓ có k ".P r o pkkℓℓk
Nói chung, một cách phổ biến để trích xuất mã là xem xét một tuyên bố có dạng mà x là đầu vào, y là đầu ra, và φ ( x , y ) giải thích ý nghĩa của nó đối với y là một đầu ra chính xác. (Trong ví dụ trên A và B là các loại danh sách và ϕ ( ℓ , k ) là " k được sắp xếp và k là hoán vị của ℓ .") Nếu ϕ nằm trong P r o p thì trích xuất sẽ cho bản đồ f :∀ x : A.∃ y: B.ϕ ( x , y)xyϕ ( x , y)yMộtBϕ ( ℓ , k )kkℓφP r o p mà φ ( x , f ( x ) ) giữ cho tất cả x ∈ A . Nếu φ là trong S e t thì chúng ta cũng có được một hàm g mà g ( x ) là bằng chứng cho thấy φ ( x , f ( x ) ) nắm giữ, cho tất cả x ∈ Af: A → Bϕ ( x , f( x ) )x ∈ AφSetgg(x)ϕ(x,f(x))x∈A. Thông thường bằng chứng là vô dụng về mặt tính toán và chúng tôi muốn loại bỏ nó, đặc biệt khi nó được lồng sâu bên trong một số tuyên bố khác. cho chúng ta khả năng để làm như vậy.Prop
Đã thêm 2015-07-29: Có một câu hỏi liệu chúng ta có thể tránh hoàn toàn hay không bằng cách tự động tối ưu hóa "mã trích xuất vô dụng". Ở một mức độ nào đó, chúng ta có thể làm điều đó, ví dụ, tất cả các mã được trích xuất từ đoạn logic phủ định (thứ được xây dựng từ loại trống, loại đơn vị, sản phẩm) là vô dụng vì nó chỉ xáo trộn xung quanh đơn vị. Nhưng có những quyết định thiết kế chính hãng người ta phải đưa ra khi sử dụng P r o p . Dưới đây là một ví dụ simpe, nơi Σ phương tiện mà chúng tôi đang trong T y p e và ∃ phương tiện chúng ta đang ở P r o p . Nếu chúng tôi trích xuất từ
PropPropΣType∃Prop
chúng ta sẽ nhận được một chương trình phân hủy n vào bit của nó thấp nhất b và các bit còn lại k , tức là nó sẽ tính toán tất cả mọi thứ. Nếu chúng ta trích xuất từ
Π n : N Σ b : { 0 , 1 } ∃ k : N
Πn:NΣb:{0,1}Σk:Nn=2⋅k+b
nbk
sau đó chương trình sẽ chỉ tính các bit thấp nhất
b . Máy không thể biết cái nào là chính xác, người dùng phải nói với nó những gì anh ta muốn.
Πn:NΣb:{0,1}∃k:Nn=2⋅k+b
b