Sự khác biệt giữa bằng chứng và chương trình (hoặc giữa các đề xuất và loại) là gì?


26

Cho rằng Tương ứng Curry-Howard được lan truyền / mở rộng rất rộng rãi, liệu có sự khác biệt nào giữa bằng chứng và chương trình (hoặc giữa các đề xuất và loại) không? Chúng ta có thể thực sự xác định chúng?


1
Có vẻ phù hợp hơn cho cstheory.stackexchange.com

Nếu op muốn, @ tôi trong một bình luận và tôi có thể di chuyển nó cho bạn.

2
John Crossley đã viết một bài báo về điều này mà tôi tình cờ thấy được đăng ở đâu đó gần đây: [Sự khác biệt giữa bằng chứng và chương trình là gì?] [ Citeseerx.ist.psu.edu/viewdoc/iêu - Tôi chưa đọc nó, nhưng tôi chưa đọc nó, nhưng tôi chưa đọc nó, nhưng nó được đề xuất ...
TJ Ellis

1
@TJ Ellis, cảm ơn vì liên kết, nhưng sau khi đọc lướt qua, có vẻ như bài báo không trả lời câu hỏi được đặt trong tiêu đề của nó (hoặc câu trả lời là "chúng giống nhau").
max taldykin

@TJ Ellis, bạn có thấy nó đăng trên reddid / r / compsci không? Tôi đã làm nó ,;) @max, tôi cảm thấy như vậy, đó là lý do tại sao tôi đăng câu hỏi này.

Câu trả lời:


20

Các ngôn ngữ lập trình mà mọi người sử dụng hàng ngày không phù hợp lắm với sự tương ứng của Curry-Howard, bởi vì hệ thống loại của họ quá yếu. Để nói điều gì đó thú vị khi sử dụng Curry-Howard cho các chương trình bắt buộc, người ta cần phải có một hệ thống loại tinh vi hơn. Cuốn sách Thích ứng bằng chứng như các chương trình đẩy góc độ này với mục đích tổng hợp các chương trình bắt buộc. Với các loại phụ thuộc ngày càng trở nên phổ biến, chắc chắn trong các ngôn ngữ chức năng nghiên cứu ( Agda , Epigram ), sự khác biệt đang trở nên mờ nhạt. Tất nhiên bạn có thể thực hiện tổng hợp / trích xuất chương trình trong câu tục ngữ định lý Coq (và có lẽ là những người khác), điều này tất nhiên dựa trên Curry-Howard.

Sự tương ứng của Curry-Howard cũng có thể được sử dụng trong các tình huống mà bằng chứng không tương ứng rõ ràng với các chương trình (hoặc chúng không phải là chương trình mà bất kỳ ai cũng sẽ chạy). Một ví dụ về điều này là trong ủy quyền mang bằng chứng . Các đề xuất tương ứng với các tuyên bố về người được ủy quyền để làm gì. Bằng chứng cung cấp bằng chứng cần thiết rằng một đề xuất giữ, do đó, yêu cầu ủy quyền được cho phép. Để mã hóa các bằng chứng, các thuật ngữ bằng chứng được đưa ra (thông qua Curry-Howard). Điều khoản bằng chứng được gửi giữa các bên dưới dạng đại diện cho bằng chứng về tính hợp lệ của các yêu cầu ủy quyền, nhưng chúng không được coi là chương trình.


1
Bạn nên đề cập đến các ngôn ngữ được gõ phụ thuộc, vì trong đó, ranh giới giữa các bằng chứng và các mệnh đề bị mờ đi.
Ohad Kammar

1
Thật. Chúng ta đừng quên tổng hợp / trích xuất chương trình của Coq.
Dave Clarke

chương trình nào sẽ tương ứng với một bằng chứng phi xây dựng (cổ điển) của mẫu ? (Giả sử rằng là một số mối quan hệ decidable thú vị ví dụ như -thứ tạm dừng TM trong bước.) (Tôi có thể yêu cầu nó như là một câu hỏi mới nếu câu trả lời không phải là rất ngắn.)T e kk T(e,k)¬k T(e,k)Tek
Kaveh

1
@Kaveh: hãy hỏi điều này như một câu hỏi riêng biệt. Trong một bình luận, bạn có thể nói "bản dịch Godel-Gentzen là một phép biến đổi tiếp tục" nhưng bất cứ điều gì ít khó hiểu hơn sẽ không phù hợp. :)
Neel Krishnaswami


10

Trong Coq, có 2 loại (Prop và Set), chúng được lập trình viên sử dụng để phân tách đâu là bằng chứng không tạo ra mã thực tế và một phần bằng chứng sẽ được sử dụng để trích xuất mã đang chạy (chương trình của bạn).

Đó là một giải pháp tốt cho vấn đề bạn hỏi về, làm thế nào để xác định những gì có nghĩa là tạo mã máy (chương trình) và những gì hiện diện để hoàn thành bằng chứng của mệnh đề (hoặc loại).

AFAIK không có cách tự động để phân biệt cả hai. Đây có thể là một cái gì đó thú vị cho nghiên cứu? Hoặc có lẽ ai đó có thể chỉ ra điều đó rõ ràng là không thể?

Với các loại phụ thuộc không chỉ không có sự phân biệt rõ ràng giữa bằng chứng và chương trình mà còn không có sự phân biệt giữa chương trình và loại! Sự khác biệt duy nhất sẽ là nơi loại (hoặc chương trình) xuất hiện, làm cho nó trở thành một phần của địa điểm "chương trình" hoặc địa điểm "loại" của một thuật ngữ nhất định.

Một ví dụ sẽ làm cho nó rõ ràng hơn tôi hy vọng:

Khi bạn sử dụng chức năng nhận dạng với các loại phụ thuộc, bạn cần chuyển loại bạn sẽ sử dụng chức năng với! Loại đang được sử dụng làm giá trị trong "chương trình" của bạn!

Giải tích Lambda chưa được đánh dấu:

id =λx.x

Với các loại phụ thuộc:

id: (A: Đặt) -> A -> A

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

Nếu bạn đang sử dụng chức năng này, thì bạn sẽ làm như ví dụ này:

id Naturals 1

Lưu ý rằng "loại" (trong trường hợp này là Tập hợp các Naturals) được truyền đi dưới dạng một giá trị bị loại bỏ để nó sẽ không bao giờ được tính toán, nhưng vẫn nằm trong phần "chương trình" của thuật ngữ. Đó cũng là điều sẽ xảy ra với các phần "bằng chứng", chúng cần phải có thuật ngữ để kiểm tra loại nhưng trong quá trình tính toán chúng sẽ bị vứt đi.


6

Tôi sẽ đi ra ngoài một chi ở đây và nói rằng, nếu bạn sẵn sàng nheo mắt một chút, bằng chứng và các chương trình chấm dứt có thể được xác định.

Bất kỳ chương trình kết thúc là một bằng chứng cho thấy bạn có thể lấy đầu vào của nó và tạo đầu ra của nó. Đây là một loại bằng chứng rất cơ bản của hàm ý.

Tất nhiên, để làm cho hàm ý này mang thông tin có ý nghĩa hơn là nêu rõ ràng, bạn cần có thể chỉ ra rằng chương trình hoạt động cho bất kỳ và tất cả các trường hợp đầu vào được vẽ từ một số lớp có ý nghĩa logic. (Và cũng vậy cho đầu ra.)

Từ hướng khác, bất kỳ bằng chứng nào với các bước suy luận hữu hạn là một chương trình biểu tượng thao túng các đối tượng trong một số hệ thống logic. (Nếu chúng ta không lo lắng quá nhiều về ý nghĩa của các biểu tượng và quy tắc logic.)

x:xT

Điều này khá đơn giản, nhưng tôi nghĩ nó cho thấy sự mạnh mẽ của ý tưởng. (Ngay cả khi một số người nhất định không thích nó. ;-))


câu trả lời rất tốt
toto

Tất nhiên, bạn nên cho rằng bạn có nghĩa là bằng chứng hữu hạn và các chương trình chấm dứt. Một số lớp chương trình không kết thúc hoạt động tốt như bằng chứng vô hạn. Đó là các chương trình không kết thúc không có năng suất mà bạn cần để ý.
wren romano

Tôi nghĩ rằng điều này là một chút khó khăn, tùy thuộc vào cách bạn xác định hữu hạn và vô hạn đối với bằng chứng. Nói chung, tất cả các bằng chứng mà chúng tôi chấp nhận là hữu hạn, bởi vì chúng phải thuyết phục một con người trong một khoảng thời gian hữu hạn nhỏ. Một bằng chứng dựa trên sơ đồ cảm ứng (tức là hầu hết các bằng chứng "vô hạn") bằng biện pháp này vẫn còn hữu hạn, chúng chỉ có các bước tượng trưng đại diện cho một tính toán vô hạn nhưng đều đặn. Một bằng chứng thực sự vô hạn, mà tôi nghĩ rằng hầu hết chúng ta sẽ từ chối như một bằng chứng hợp lệ, sẽ là một trong đó bạn thực sự phải xem xét vô số sự thật khác biệt để xác nhận.
Marc Hamann

5

Bằng chứng không liên quan?

Khi bạn viết một số chương trình, bạn đang quan tâm đến hiệu suất, tiêu thụ bộ nhớ của nó, vv
Ví dụ: nó tốt hơn để sử dụng một số thuật toán sắp xếp thông minh thay vì bong bóng sắp xếp, thậm chí nếu triển khai của họ có các loại tương tự (thậm chí trong bối cảnh loại phụ thuộc).

Nhưng khi bạn chứng minh một số định lý thì đó chỉ là sự tồn tại của một bằng chứng mà bạn quan tâm.

Tất nhiên, từ quan điểm thẩm mỹ, một số bằng chứng đơn giản hơn / đẹp hơn / truyền cảm hứng / vv (ví dụ: bằng chứng từ Sách).


4

Nếu bạn chấp nhận thư từ Curry Curry Howard thì câu hỏi chủ yếu là vấn đề triết học. "Bằng chứng và chương trình có khác nhau không? Tất nhiên. Làm thế nào? Vâng, chúng tôi gọi bằng chứng là 'bằng chứng' và chúng tôi gọi chương trình là 'chương trình'."

Hoặc nói một cách dễ hiểu, nếu có sự bất đồng nhất giữa các bằng chứng và chương trình thì có vẻ như rõ ràng là có câu hỏi thì câu hỏi của bạn là liệu có bất kỳ lời tiên tri nào có khả năng phân biệt hai điều này không. Con người phân loại chúng là khác nhau (đối với hầu hết các phần), do đó, chắc chắn có thể tranh cãi rằng một nhà tiên tri như vậy tồn tại. Câu hỏi quan trọng sau đó trở thành liệu có bất kỳ sự khác biệt có ý nghĩa giữa chúng hay không, điều này được đưa ra cho cuộc tranh luận triết học. "Bằng chứng" là gì? Không có định nghĩa chính thức về những gì cấu thành một bằng chứng; đó là một thuật ngữ của nghệ thuật, giống như khái niệm "có thể tính toán hiệu quả" trong luận án Nhà thờ Turing. Đối với vấn đề đó, "chương trình" cũng không có định nghĩa chính thức.

Đây là những từ của ngôn ngữ tự nhiên được sử dụng để phân loại các lĩnh vực khác nhau của yêu cầu toán học. Những gì Curry và Howard quan sát được là hai lĩnh vực khác nhau trong thực tế nghiên cứu cùng một thứ. Nhận thấy kết nối này rất quan trọng vì nó nói rằng các nhà nghiên cứu khác nhau nên nói chuyện với nhau. Nhưng ở một cấp độ khác, để ý sự kết nối là tin vào sự khác biệt giữa chúng. Khi giải quyết một vấn đề, đôi khi sẽ có ích hơn khi nghĩ về nó như một vấn đề lập trình, trong khi những lần khác lại có ích hơn khi nghĩ về nó như một vấn đề logic. Sự khác biệt trong quan điểm này, theo tôi là, sự khác biệt quan trọng giữa chúng. Nhưng liệu một sự khác biệt về quan điểm có tạo nên sự khác biệt về bản sắc hay không là một câu hỏi triết học sâu sắc đã được khám phá ít nhất là từ thời FregeUeber Sinn und Bedeutung .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.