Tóm lại : Thuật toán là phần mang tính xây dựng của một bằng chứng mang tính xây dựng rằng một vấn đề nhất định có một giải pháp. Động lực cho định nghĩa này là sự đồng hình hóa Curry-Howard giữa các chương trình và bằng chứng, xem xét rằng một chương trình chỉ có lợi ích nếu nó giải quyết được một vấn đề, nhưng có thể chứng minh như vậy. Định nghĩa này cho phép trừu tượng hơn và để lại một số cánh cửa mở về loại lĩnh vực có thể liên quan, ví dụ về các thuộc tính hữu hạn.
Cảnh báo . Tôi đang cố gắng tìm một cách tiếp cận chính thức để trả lời câu hỏi. Tôi nghĩ rằng nó là cần thiết, nhưng dường như không có người dùng nào trả lời cho đến nay (bao gồm cả tôi và một số ít rõ ràng về nó trong các bài đăng khác) có nền tảng phù hợp để phát triển đúng các vấn đề liên quan đến toán học xây dựng, lý thuyết bằng chứng, lý thuyết loại và các kết quả như Curry-Howard giữa các bằng chứng và chương trình. Tôi đang làm hết sức mình ở đây, với bất kỳ đoạn kiến thức nào tôi có (tin vào) có, và tôi chỉ nhận thức được những hạn chế của câu trả lời này. Tôi chỉ hy vọng đưa ra một số gợi ý về những gì tôi nghĩ câu trả lời sẽ như thế nào. Nếu bạn thấy bất kỳ điểm nào rõ ràng sai chính thức (có thể chứng minh được), vui lòng cho tôi ngay bây giờ trong một nhận xét - hoặc qua email.
Xác định một số vấn đề
Một cách tiêu chuẩn để xem xét thuật toán là tuyên bố rằng thuật toán là một chương trình được chỉ định chính xác tùy ý cho một số thiết bị máy tính , bao gồm cả những thuật toán không có giới hạn trong bộ nhớ. Các langage cũng có thể là ngôn ngữ máy tính. Trên thực tế, nó là đủ để xem xét tất cả các chương trình cho một thiết bị máy tính hoàn chỉnh Turing (ngụ ý không có giới hạn bộ nhớ). Nó có thể không cung cấp cho bạn tất cả các bài thuyết trình về thuật toán, theo nghĩa là các thuật toán phải được thể hiện dưới dạng phụ thuộc vào chi tiết của nó trên bối cảnh diễn giải, thậm chí là lý thuyết, vì mọi thứ đều được định nghĩa theo một số mã hóa. Nhưng, vì nó sẽ tính toán tất cả những gì cần tính toán, nên nó sẽ bao gồm bằng cách nào đó tất cả các algoritms, cho đến mã hóa.
π
π, có thể theo nghĩa toán học của hầu hết tất cả. Nhưng điều đó sẽ đòi hỏi độ chính xác cao hơn trong định nghĩa.
Vì vậy, câu hỏi thực sự là để biết các thuật toán có ý nghĩa là gì. Câu trả lời là các thuật toán có ý nghĩa là những thuật toán giải quyết vấn đề, tính toán từng bước "giải pháp", "câu trả lời" cho vấn đề đó. Một thuật toán rất thú vị nếu nó liên quan đến một vấn đề mà nó giải quyết.
Vì vậy, đưa ra một vấn đề chính thức làm thế nào để chúng ta có được một thuật toán giải quyết vấn đề. Cho dù rõ ràng hay ngầm định, các thuật toán được liên kết với ý tưởng rằng có tồn tại một giải pháp cho vấn đề, điều này có thể được chứng minh là đúng. Cho dù kỹ thuật chứng minh của chúng tôi là chính xác là một vấn đề khác, nhưng chúng tôi ít nhất cố gắng để thuyết phục bản thân. Nếu bạn giới hạn mình trong toán học xây dựng, đó thực sự là những gì chúng ta phải làm (và là một hạn chế tiên đề rất dễ chấp nhận đối với hầu hết toán học), cách để chứng minh sự tồn tại của một giải pháp là trải qua các bước chứng minh thực sự thể hiện một cấu trúc đại diện cho giải pháp, bao gồm cả các bước khác có thể thiết lập tính chính xác.
Tất cả các lập trình viên đều nghĩ một cái gì đó như: nếu tôi sử dụng dữ liệu theo cách tương tự và như vậy, thì tôi nhận được tiện ích này có các thuộc tính phù hợp vì định lý Sesame và chạy phép chuyển đổi bảo toàn foo này, tôi nhận được câu trả lời mong muốn . Nhưng bằng chứng thường không chính thức và chúng tôi không tìm ra tất cả các chi tiết, điều này giải thích tại sao một vệ tinh cố quay quanh Sao Hỏa dưới lòng đất (trong số những thứ khác). Chúng tôi thực hiện nhiều lý do, nhưng chúng tôi thực sự chỉ giữ phần xây dựng để xây dựng giải pháp và chúng tôi mô tả nó bằng ngôn ngữ máy tính để trở thành thuật toán giải quyết vấn đề.
Các thuật toán thú vị (hoặc chương trình)
Tất cả điều này là để giới thiệu những ý tưởng sau đây, là đối tượng của nhiều nghiên cứu hiện tại (trong đó tôi không phải là chuyên gia). Khái niệm " thuật toán thú vị " được sử dụng ở đây là của tôi, được giới thiệu như một người giữ chỗ không chính thức cho các định nghĩa chính xác hơn.
Một thuật toán thú vị là phần xây dựng của một bằng chứng xây dựng rằng một vấn đề nhất định có một giải pháp . Điều đó có nghĩa là bằng chứng thực sự phải thể hiện giải pháp chứ không chỉ đơn giản là chứng minh sự tồn tại của nó, ví dụ bằng mâu thuẫn. Để biết thêm chi tiết, xem Logic Trực giác và Cấu tạo trong Toán học.
Tất nhiên đây là một định nghĩa rất hạn chế, chỉ xem xét những gì tôi gọi là thuật toán thú vị. Vì vậy, nó bỏ qua gần như tất cả chúng. Nhưng tất cả các sách giáo khoa của chúng tôi về thuật toán cũng vậy. Họ cố gắng chỉ dạy một số trong những người thú vị.
Đưa ra tất cả các tham số của vấn đề (dữ liệu đầu vào), nó sẽ cho bạn biết làm thế nào để có được kết quả được chỉ định từng bước. Một ví dụ điển hình là độ phân giải của phương trình ( thuật toán tên thực sự bắt nguồn từ tên của nhà toán học Ba Tư, Muḥammad ibn Mūsā al-Khwārizmī , người đã nghiên cứu độ phân giải của một số phương trình). Các phần của bằng chứng được sử dụng để xác định rằng một số giá trị được tính toán trong thuật toán có một số thuộc tính, nhưng các phần này không cần phải được giữ trong chính thuật toán.
Tất nhiên, điều này phải diễn ra trong khuôn khổ logic chính thức để thiết lập dữ liệu được tính toán với những bước nào, các bước tính toán cơ bản được phép và các tiên đề được sử dụng là gì.
Quay trở lại ví dụ giai thừa của bạn, nó có thể được hiểu là một thuật toán, mặc dù là một thuật toán tầm thường. Hàm giai thừa bình thường tương ứng với một bằng chứng rằng, với một số khung số học và được cho một số nguyên n, có một số là tích của n số nguyên đầu tiên. Điều này là khá đơn giản, như là tính toán giai thừa. Nó có thể phức tạp hơn cho các chức năng khác.
Bây giờ, nếu bạn quyết định lập bảng giai thừa, giả sử bạn có thể, điều này không đúng với tất cả các số nguyên (nhưng có thể đúng với một số miền hữu hạn của các giá trị), tất cả những gì bạn đang làm là bao gồm trong các tiên đề của bạn bằng cách xác định bằng một tiên đề mới giá trị của nó cho mỗi số nguyên, do đó bạn không còn cần phải chứng minh (do đó để tính toán) bất cứ điều gì.
Nhưng một hệ thống các tiên đề được coi là hữu hạn (hoặc ít nhất là được xác định một cách hữu hạn). Và có vô số giá trị cho giai thừa, mỗi giá trị một số nguyên. Vì vậy, bạn đang gặp rắc rối cho hệ tiên đề hữu hạn của mình nếu bạn tiên đề hóa một hàm vô hạn, tức là được xác định trên một miền vô hạn. Điều đó dịch tính toán trong thực tế là việc tìm kiếm bảng của bạn sẽ không thể được thực hiện cho tất cả các số nguyên. Điều đó sẽ giết chết yêu cầu về độ chính xác thông thường đối với các thuật toán (nhưng nó có nghiêm ngặt như thường được trình bày không?).
Bạn có thể quyết định có một trình tạo tiên đề được xác định chính xác để xử lý tất cả các trường hợp. Điều này sẽ số tiền, ít nhiều, bao gồm chương trình giai thừa chuẩn trong thuật toán của bạn để khởi tạo mảng khi cần. Điều đó được gọi là ghi nhớ bởi các lập trình viên. Đây thực sự là lần gần nhất bạn có được tương đương với một bảng được tính toán trước. Có thể hiểu rằng có một bảng được tính toán trước, ngoại trừ thực tế bảng được tạo ra trong chế độ đánh giá lười biếng , bất cứ khi nào cần thiết. Cuộc thảo luận này có lẽ sẽ cần một chút quan tâm chính thức hơn.
Bạn có thể xác định các hoạt động nguyên thủy của mình theo ý muốn (trong sự nhất quán với hệ thống chính thức của bạn) và gán cho chúng bất kỳ chi phí nào bạn chọn khi sử dụng thuật toán, để phân tích hiệu suất hoặc độ phức tạp. Nhưng, nếu các hệ thống cụ thể thực sự thực hiện thuật toán của bạn (ví dụ máy tính hoặc não) không thể tôn trọng các thông số kỹ thuật chi phí này, phân tích của bạn có thể thú vị về mặt trí tuệ, nhưng không có giá trị sử dụng thực tế trong thế giới thực.
21000
Chương trình nào thú vị
Thảo luận này nên được liên kết chính xác hơn với các kết quả như sự đồng hình hóa
Curry-Howard giữa các chương trình và bằng chứng. Nếu bất kỳ chương trình nào thực sự là bằng chứng của một cái gì đó, thì bất kỳ chương trình nào cũng có thể được hiểu là một chương trình thú vị theo nghĩa của định nghĩa trên.
Tuy nhiên, theo sự hiểu biết (có giới hạn) của tôi, sự đồng hình này chỉ giới hạn ở các chương trình có thể được gõ tốt trong một số hệ thống gõ thích hợp, trong đó các kiểu tương ứng với các mệnh đề của lý thuyết tiên đề. Do đó không phải tất cả các chương trình có thể đủ điều kiện là chương trình thú vị. Tôi đoán là theo nghĩa đó, một thuật toán được cho là để giải quyết vấn đề.
Điều này có lẽ loại trừ hầu hết các chương trình "được tạo ngẫu nhiên".
Nó cũng là một định nghĩa hơi mở về "thuật toán thú vị" là gì. Bất cứ chương trình nào có thể được xem là thú vị chắc chắn là như vậy, vì có một hệ thống loại được xác định làm cho nó thú vị. Nhưng một chương trình không thể đánh máy cho đến nay, có thể trở nên có thể đánh máy được với một loại sytem tiên tiến hơn, và do đó trở nên thú vị. Chính xác hơn, nó luôn luôn thú vị, nhưng vì thiếu kiến thức về hệ thống loại thích hợp, chúng tôi không thể biết điều đó.
Tuy nhiên, người ta biết rằng không phải tất cả các chương trình đều có thể đánh máy được, vì người ta biết rằng một số biểu thức lambda, như thực hiện bộ kết hợp Y , không thể được nhập vào hệ thống loại âm thanh .
Quan điểm này chỉ áp dụng cho các hình thức lập trình có thể được liên kết trực tiếp với một số hệ thống chứng minh tiên đề. Tôi không biết làm thế nào nó có thể được mở rộng cho các hình thức tính toán cấp thấp như Máy Turing. Tuy nhiên, vì thuật toán và khả năng tính toán thường là một trò chơi mã hóa các vấn đề và giải pháp (nghĩ về arithologists được mã hóa trong phép tính lambda ), người ta có thể xem xét rằng bất kỳ tính toán được xác định chính thức nào có thể được hiển thị là mã hóa thuật toán cũng là một thuật toán. Các bảng mã như vậy có lẽ chỉ sử dụng một phần rất nhỏ của những gì có thể được thể hiện trong một hình thức chính thức cấp thấp, chẳng hạn như Turing Machines.
Một lợi ích của phương pháp này là nó đưa ra một khái niệm về thuật toán trừu tượng và độc lập hơn với các vấn đề về mã hóa thực tế, về "tính đại diện vật lý" của miền tính toán. Vì vậy, người ta có thể, ví dụ, xem xét các miền với các đối tượng vô hạn miễn là có một cách sử dụng âm thanh tính toán.