Làm thế nào là ngôn ngữ lập trình và nền tảng của toán học liên quan?


30

Về cơ bản tôi nhận thức được ba nền tảng cho toán học

  1. Đặt lý thuyết
  2. Lý thuyết loại
  3. Chuyên mục lý thuyết

Vậy những ngôn ngữ lập trình và nền tảng của toán học liên quan đến những cách nào?

CHỈNH SỬA

Câu hỏi ban đầu là "Ngôn ngữ lập trình dựa trên nền tảng của toán học"

với sự bổ sung của

Và triển khai lý thuyết
1. Lý thuyết loại trong Coq
2. Đặt lý thuyết trong SETL
3. Lý thuyết loại trong Haskell

Dựa trên một gợi ý, điều này đã được thay đổi thành "Ngôn ngữ lập trình và nền tảng của toán học liên quan như thế nào"

Vì đây là một trong những câu hỏi mà tôi không biết đủ về những gì tôi đã hỏi nhưng muốn tìm hiểu điều gì đó, tôi đang điều chỉnh câu hỏi để làm cho nó có giá trị hơn cho việc học và những người khác, nhưng không để lại chi tiết để không làm cho Câu trả lời hiện tại của Andrej Bauer dường như lạc đề.

Cảm ơn tất cả các ý kiến ​​và câu trả lời cho đến nay, tôi đang học hỏi từ họ.


1
Tôi không chắc chắn nếu tôi hiểu câu hỏi hoặc các giả định được nêu trong đó. Coq không phải là một ngôn ngữ lập trình theo như tôi hiểu. Các chương trình có thể được trích xuất từ ​​bằng chứng Coq nhưng điều đó không làm cho nó trở thành ngôn ngữ lập trình. Ngoài ra lý thuyết thể loại và lý thuyết loại có liên quan chặt chẽ với nhau vì vậy tôi không chắc chúng ta có thể phân loại chúng như bạn có hay không. Không biết về SETL. Xem thêm danh sách các trợ lý chứng minh trên Wikipedia.
Kaveh

3
Haskell không phải là "một thực thi của lý thuyết thể loại", và trong mọi trường hợp, nền tảng của toán học phục vụ một mục đích khác với ngôn ngữ lập trình. Trong khi một số loại so sánh có thể được thực hiện, thật không tốt khi cố gắng buộc so sánh thành một mối quan hệ chính thức.
Andrej Bauer

1
Liên kết có liên quan về bộ ba thánh
vườn

Câu trả lời:


29

[Lưu ý: đoạn văn này hiện đã lỗi thời.] Tiêu đề câu hỏi của bạn chứa một giả định không chính đáng, cụ thể là các ngôn ngữ lập trình là "dựa trên nền tảng của toán học". Điều này thường không phải là trường hợp, mặc dù hai lĩnh vực có mối quan hệ quan trọng. Một tuyên bố chính xác hơn sẽ là (một số) ngôn ngữ lập trình được thiết kế bằng các kỹ thuật nền tảng. Một câu hỏi tốt hơn để hỏi là "ngôn ngữ lập trình và nền tảng của toán học liên quan như thế nào?"

Kết nối chung nhất được thể hiện trong các chương trình chứng minh khẩu hiệu , có thể được thực hiện để hoạt động theo nhiều cách. Sự tương ứng của Curry-Howard là rõ ràng nhất. Với nó, chúng tôi liên quan cùng một lúc loại lý thuyết, logic và lập trình. Nhưng cần nhấn mạnh rằng sự tương ứng của Curry-Howard không hoạt động tốt khi có sự đệ quy chung (vì mọi loại đều trở nên có người ở), điều mà mọi ngôn ngữ lập trình đa năng đều hỗ trợ.

Một cách tinh tế hơn để làm cho các chương trình chứng minh khẩu hiệu hoạt động là sử dụng tính khả thi . Ở đây chúng tôi cũng liên quan đến bằng chứng và chương trình, nhưng bây giờ hướng đi từ bằng chứng đến chương trình: mọi bằng chứng đưa ra một chương trình, nhưng không phải mọi chương trình đều nhất thiết phải là bằng chứng.

Ví dụ chính của ngôn ngữ lập trình dựa trên nền tảng là Agda , đơn giản việc thực hiện lý thuyết loại phụ thuộc. Tuy nhiên, Agda không phải là ngôn ngữ lập trình có mục đích chung vì nó không hỗ trợ đệ quy chung. Mọi hàm trong Agda đều là tổng số và có các hàm tính toán không thể thực hiện được trong Agda. Trong thực tế, các lập trình viên sẽ không nhận thấy điều này, nhưng họ sẽ nhận thấy rằng Agda không cho phép các giá trị không xác định, ví dụ như các vòng lặp vô hạn.

Coqkhông một ngôn ngữ lập trình mà là một trợ lý bằng chứng. Tuy nhiên, nó cũng có khả năng trích xuất cung cấp các chương trình từ bằng chứng. Trợ lý bằng chứng và ngôn ngữ lập trình không nên nhầm lẫn với nhau.

Chúng ta không nên quên rằng prolog và các ngôn ngữ lập trình logic khác lấy cảm hứng từ ý tưởng rằng tính toán là tìm kiếm bằng chứng . Điều này tất nhiên liên quan đến họ chặt chẽ với logic.

Haskell là một ngôn ngữ lập trình có mục đích chung dựa trên lý thuyết miền . Điều đó có nghĩa là, ngữ nghĩa của nó là lý thuyết miền bởi vì nó phải tính đến một phần chức năng và đệ quy. Cộng đồng Haskell đã phát triển một số kỹ thuật lấy cảm hứng từ lý thuyết thể loại, trong đó monads được biết đến nhiều nhất nhưng không nên nhầm lẫn với monads . Tổng quát hơn, các tính năng lập trình nâng cao thường được xử lý bằng sự kết hợp giữa lý thuyết miền và lý thuyết thể loại, nhưng đây không phải là điều mà lập trình viên Haskell trên đường phố yêu thích. Cái gọi là "phạm trù cú pháp" của các loại Haskell là quan điểm của một giáo dân về cách Haskell và lý thuyết thể loại tương ứng với nhau.

Đặt lý thuyết (cổ điển hoặc xây dựng) dường như truyền cảm hứng cho các ý tưởng trong ngôn ngữ lập trình ở mức độ thấp hơn. Tất nhiên, lý thuyết tập hợp xây dựng có mối liên hệ với lập trình thông qua logic xây dựng. Một ứng dụng quan trọng của lý thuyết tập hợp trực giác cho các ngôn ngữ lập trình được đưa ra bởi Alex Simpson, người đã sử dụng nó để làm cho lý thuyết miền tổng hợp hoạt động. Nhưng đây là công cụ khá tiên tiến, có thể thấy những slide này . Jean-Louis Krivine đã phát triển một thương hiệu thực tế rất thú vị cho lý thuyết tập hợp cổ điển. Đây có vẻ là một cách tốt để liên quan đến lý thuyết và lập trình cổ điển.

Tóm lại, lý thuyết về ngôn ngữ lập trình sử dụng các kỹ thuật nền tảng. Điều này không đáng ngạc nhiên, vì chúng tôi coi tính toán là một khái niệm cơ bản. Nhưng thật quá ngây thơ khi nói rằng các ngôn ngữ lập trình "dựa" vào một nền tảng nhất định. Trên thực tế, trichotomy của các nền tảng "lý thuyết tập hợp - lý thuyết loại - lý thuyết phạm trù" một lần nữa chỉ là một quan sát cấp cao hữu ích có thể được thực hiện chính xác về mặt toán học theo nhiều cách khác nhau, nhưng không có gì cần thiết về nó. Đó là một tai nạn lịch sử.


"ý kiến ​​mà tính toán là tìm kiếm bằng chứng ." Tôi bối rối trước tuyên bố này. Chắc chắn, tìm kiếm bằng chứng là một hình thức tính toán, nhưng không phải tất cả các tính toán là tìm kiếm bằng chứng? Trong bối cảnh của câu hỏi này, cũng có xác minh bằng chứng, kiểm tra loại. Tổng quát hơn, chỉ đơn giản là việc thêm 5 + 3. Bạn có ý nghĩa gì bởi tuyên bố này?
dùng56834

6

Đây là một chủ đề rất phức tạp và có nhiều cuốn sách hay về chủ đề này, một cuốn gần đây được gọi là Nhà thờ Turings, nguồn gốc của vũ trụ kỹ thuật số và cũng là Động cơ của logic, nhà toán học và nguồn gốc của máy tính .

ngôn ngữ máy tính đã phát triển qua nhiều thập kỷ, nhưng tin hay không có hai ngôn ngữ lập trình gốc cho thấy toán học và khoa học máy tính có mối quan hệ mật thiết với nhau:

có hai nhân vật quan trọng vượt qua ranh giới toán học và khoa học máy tính với "ngôn ngữ lập trình":

  • lý thuyết thông tin do Shannon tiên phong cho thấy mối liên hệ sâu sắc giữa toán học và khoa học máy tính

  • một nhân vật quan trọng khác giao thoa giữa toán học và khoa học máy tính là Von Neumann . ông đã phát minh ra kiến ​​trúc von neumann lưu trữ các chương trình trong bộ nhớ.

thậm chí sớm hơn "ngôn ngữ lập trình":

  • từ tiếng Anh "máy tính" ban đầu có nghĩa giống như một "máy tính" sử dụng các phép toán trên số và ý nghĩa của nó đã chuyển đáng kể sang khái niệm lập trình đa dụng ngày nay. do đó, có một kết nối giữa các ngôn ngữ lập trình và máy tính đầu tiên.
  • thẻ đục lỗ được sử dụng trong khung dệt từ cuối thế kỷ 19 và đầu thế kỷ 20 là một "ngôn ngữ lập trình" cho các mẫu dệt. lưu ý rằng thẻ đục lỗ đã được sử dụng để lập trình máy tính lớn vào những năm 1960. ban đầu chúng được xem là "máy tính toán" (sử dụng toán học!) không quá nhiều máy tính đa năng, hiện đại.
  • Bắp cảiAda Lovelace phát triển các khái niệm thô sơ về "ngôn ngữ lập trình" vào giữa những năm 1800 trên một "công cụ tính toán"
  • đại số Boolean ban đầu là một khái niệm toán học thuần túy được phát minh bởi Boole
  • bàn tính cổ (thiên niên kỷ) để tính toán được coi là tiền thân của máy tính hiện đại. nhưng có thể nói rằng các hoạt động để thao túng nó là một loại "ngôn ngữ lập trình" (tiếp theo là con người)

tuy nhiên, trong các ngôn ngữ lập trình hiện đại khi sự trừu tượng đã tăng lên và mở rộng, sự kết nối trực tiếp, rõ ràng với toán học đã phần nào giảm đi trong nhiều thập kỷ, nhưng nó luôn luôn trở nên khá nội tại và theo một cách nào đó, nó đã được củng cố. ví dụ các ngôn ngữ như Java với các loại nghiêm ngặt của nó có các kết nối với toán học và vào đầu những năm 1990, các ngôn ngữ máy tính chính thống (ví dụ: c ++, Java, Ruby, v.v.) đã bắt đầu triển khai rõ ràng nhiều đối tượng toán học cấp cao hơn gần như nguyên thủy trong các ngôn ngữ như bộ, cây (ví dụ Btrees hoặc hashmap), v.v.

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.