Idris không thể làm gì khi từ bỏ tính hoàn chỉnh của Turing?


35

Tôi biết rằng Idris có các loại phụ thuộc nhưng không hoàn thành. Điều gì không thể làm được bằng cách từ bỏ tính hoàn chỉnh của Turing và điều này có liên quan đến việc có các loại phụ thuộc không?

Tôi đoán đây là một câu hỏi khá cụ thể, nhưng tôi không biết nhiều về các loại phụ thuộc và các hệ thống loại liên quan.


2
Tôi đoán bạn đang tìm kiếm một ví dụ cụ thể? Tôi không quen thuộc với Idris, nhưng trong Isabelle / HOL bạn không thể viết (hay đúng hơn là biên dịch) các hàm không luôn luôn chấm dứt (tệ hơn, bạn cần đưa ra bằng chứng chấm dứt ).
Raphael

Một cái gì đó dọc theo dòng này yeah - Tôi không hoàn toàn chắc chắn liệu sẽ có một trường hợp khá thích hợp như bạn không thể mã hóa một ngôn ngữ với các thuộc tính nhất định trong hệ thống loại, hoặc liệu nó có chung chung hơn một chút không (ví dụ như bạn đã nói , tất cả các chức năng phải được chứng minh là chấm dứt)
Squidly

1
Đoán giả định sai lầm này đến từ Edwin Brady nói rằng Idris là "Pacman hoàn thành". Tôi nghĩ rằng điểm chính của anh ấy khi nói "Pacman hoàn thành" thay vì "Turing hoàn thành", là anh ấy muốn nhấn mạnh tầm quan trọng của ngôn ngữ có thể dễ dàng biên dịch bởi bộ não của con người và không chỉ máy móc! .. những ngôn ngữ ngớ ngẩn như BrainFuck chắc chắn Turing hoàn thành, nhưng nó có thể mất một bộ não con người khá một thời gian để mã thấu hiểu viết bằng Brainfuck, do đó phát triển, và thậm chí quan trọng hơn việc duy trì , một chương trình Pacman trong Brainfuck mất khá một nỗ lực ..
Michelrandahl

@Mitzh Không hẳn. Tôi nghĩ rằng đó là vì tôi đã hiểu nhầm điều mà tôi nghe anh ấy nói trong một cuộc nói chuyện.
Mực

Câu trả lời:


50

Idris là Turing Hoàn thành! Nó kiểm tra tổng số (chấm dứt khi lập trình với dữ liệu, năng suất khi lập trình với codata) nhưng không yêu cầu mọi thứ là tổng.

Thật thú vị, có dữ liệu và codata là đủ để mô hình hóa Turing Completeness vì bạn có thể viết một đơn nguyên cho các chức năng một phần. Tôi đã làm điều này, nhiều năm trước, ở Coq - bây giờ có lẽ nó đã được ghi lại nhưng đây vẫn là: http://eb.host.cs.st-andrews.ac.uk/Partial/partial.v .

Bạn cần một lối thoát để thực sự chạy những thứ như vậy, nhưng Idris cho phép bạn làm điều đó.

Idris sẽ không giảm các chức năng một phần ở cấp độ loại, để giữ cho việc kiểm tra loại có thể quyết định. Ngoài ra, chỉ có các chương trình tổng thể có thể được tin là bằng chứng hợp lý.


4
Bản thân của một người đàn ông. Năng suất trong bối cảnh này là gì?
Mực

5
Kết thúc kép: trong khi một định nghĩa quy nạp phải chấm dứt (bằng cách tiêu thụ tất cả dữ liệu của nó) thì một định nghĩa cưỡng chế phải có hiệu quả - trong thực tế, điều này có nghĩa là, bất kỳ cuộc gọi đệ quy nào cũng phải được bảo vệ bởi một nhà xây dựng. Tôi đã tìm thấy lời giải thích này là rõ ràng nhất (ymmv): adam.chlipala.net/cpdt/html/Coindulation.html
Edwin Brady

14

Đầu tiên, tôi cho rằng bạn đã nghe nói về luận án Church-Turing , trong đó tuyên bố rằng bất cứ điều gì chúng ta gọi là tính toán, là một thứ gì đó có thể được thực hiện với máy Turing (hoặc bất kỳ mô hình tương đương nào khác). Vì vậy, một ngôn ngữ hoàn chỉnh Turing là một ngôn ngữ trong đó bất kỳ tính toán nào cũng có thể được thể hiện. Ngược lại, một ngôn ngữ không hoàn chỉnh Turing là một ngôn ngữ trong đó có một số tính toán không thể diễn tả được.

Ok, đó không phải là rất nhiều thông tin. Để tôi lấy một ví dụ. Có một điều bạn không thể làm bằng bất kỳ ngôn ngữ chưa hoàn chỉnh Turing nào: bạn không thể viết trình giả lập máy Turing (nếu không bạn có thể mã hóa mọi tính toán trên máy Turing mô phỏng).

Ok, điều đó vẫn không có nhiều thông tin. Câu hỏi thực sự là, chương trình hữu ích nào không thể được viết bằng ngôn ngữ Turing-không đầy đủ? Chà, không ai đưa ra định nghĩa về chương trình hữu ích, có thể bao gồm tất cả các chương trình mà ai đó đã viết ở đâu đó cho mục đích hữu ích và không bao gồm tất cả các tính toán của máy Turing. Vì vậy, thiết kế một ngôn ngữ Turing-không đầy đủ trong đó bạn có thể viết tất cả các chương trình hữu ích vẫn là một mục tiêu nghiên cứu rất dài hạn.

Bây giờ có một số loại ngôn ngữ Turing không hoàn chỉnh khác nhau ngoài kia, và chúng khác nhau về những gì chúng không thể làm. Tuy nhiên, có một chủ đề phổ biến: Các ngôn ngữ hoàn chỉnh phải bao gồm một số cách để chấm dứt có điều kiện hoặc tiếp tục trong một thời gian không bị giới hạn bởi kích thước chương trình và cách để chương trình sử dụng một lượng bộ nhớ phụ thuộc vào đầu vào . Cụ thể, hầu hết các ngôn ngữ lập trình bắt buộc cung cấp các khả năng này thông qua các vòng lặp và phân bổ bộ nhớ động tương ứng. Hầu hết các ngôn ngữ lập trình chức năng cung cấp các khả năng này thông qua đệ quy và lồng cấu trúc dữ liệu.

Idris được truyền cảm hứng mạnh mẽ bởi Agda . Agda là một ngôn ngữ được thiết kế để chứng minh các định lý . Bây giờ chứng minh các định lý và các chương trình đang chạy có liên quan rất chặt chẽ với nhau , vì vậy bạn có thể viết các chương trình trong Agda giống như bạn chứng minh một định lý. Theo trực giác, một bằng chứng của định lý A A ngụ ý BÊ là một hàm lấy một bằng chứng của định lý A làm đối số và trả về một bằng chứng của định lý B.

Vì mục tiêu của hệ thống là chứng minh các định lý, bạn không thể để lập trình viên viết các hàm tùy ý. Hãy tưởng tượng ngôn ngữ cho phép bạn viết một hàm đệ quy ngớ ngẩn mà chỉ gọi chính nó:

oops : A -> B
oops x = oops x

Bạn không thể để sự tồn tại của một hàm như vậy thuyết phục bạn rằng A ngụ ý B, nếu không bạn sẽ có thể chứng minh bất cứ điều gì và không chỉ là các định lý đúng! Vì vậy, Agda (và các định lý tương tự provers) cấm đệ quy tùy ý. Khi bạn viết một hàm đệ quy, bạn phải chứng minh rằng nó luôn luôn chấm dứt , để bất cứ khi nào bạn chạy nó trên một bằng chứng của định lý A, bạn biết rằng nó sẽ xây dựng một bằng chứng của định lý B.

Hạn chế thực tế ngay lập tức của Agda là bạn không thể viết các hàm đệ quy tùy ý. Do hệ thống phải có khả năng từ chối tất cả các hàm không kết thúc, nên tính không ổn định của vấn đề tạm dừng (hay nói chung là định lý của Rice ) đảm bảo rằng cũng có các hàm kết thúc bị từ chối. Một khó khăn thực tế thêm vào là bạn phải giúp hệ thống chứng minh rằng chức năng của bạn không chấm dứt.

Có rất nhiều nghiên cứu đang diễn ra về việc làm cho các hệ thống chứng minh trở nên giống ngôn ngữ lập trình hơn mà không ảnh hưởng đến sự đảm bảo của chúng rằng nếu bạn có chức năng từ A đến B, thì nó cũng tốt như một bằng chứng toán học mà A ngụ ý B. Mở rộng hệ thống để chấp nhận nhiều hơn chức năng chấm dứt là một trong những chủ đề nghiên cứu. Các hướng mở rộng khác bao gồm việc đối phó với các mối quan tâm của thế giới thực như thế giới như là đầu vào / đầu ra và đồng thời. Một thách thức khác là làm cho các hệ thống này có thể tiếp cận được với những người phàm tục (hoặc có thể thuyết phục những người phàm trần mà thực tế chúng có thể truy cập được).

Tôi không quen với Idris. Đó là một thách thức về những thách thức tôi vừa đề cập. Theo như tôi hiểu từ một cái nhìn lướt qua tại 2013 bản thảo , Idris Turing hoàn tất, nhưng bao gồm một kiểm tra tổng thể. Trình kiểm tra tổng thể xác minh rằng mọi hàm được chú thích với từ khóa totalkết thúc. Đoạn ngôn ngữ chỉ chứa các chương trình Idris trong đó mọi chức năng đều có sức mạnh biểu cảm tương tự Arda (có thể không khớp chính xác do sự khác biệt trong lý thuyết loại, nhưng đủ gần để bạn không chú ý trừ khi bạn cố tình thử).

Đối với các ví dụ khác về các ngôn ngữ không hoàn chỉnh Turing theo các cách khác nhau, hãy xem các giới hạn thực tế của một ngôn ngữ hoàn chỉnh không bảo mật như Coq là gì? (mà câu trả lời này là một phần lớn được lấy từ).


3
" chương trình hữu ích nào không thể được viết bằng ngôn ngữ Turing-chưa hoàn chỉnh?" Một máy ảo Java.
David Richerby

@DavidR Richby Bạn có thể không? JVM có thực sự hoàn chỉnh? Có giới hạn về kích thước của một đối tượng riêng lẻ, bạn có thể sắp xếp để phân bổ và truy cập số lượng đối tượng không giới hạn không? Ví dụ, trong C, câu trả lời dường như là không vì chỉ có nhiều giá trị con trỏ.
Gilles 'SO- ngừng trở nên xấu xa'

Đối với độc giả quan tâm đến phần đó, chúng tôi có một bài viết khác về lý do tại sao không thể có ngôn ngữ lập trình cho chính xác các ngôn ngữ luôn kết thúc.
Raphael

3
@Gilles Tôi nêu quan điểm của bạn nhưng không ít nhiều tương đương với việc nói rằng không có ngôn ngữ lập trình thực tế nào là Turing-Complete? Rốt cuộc, bất kỳ việc thực hiện nào cũng sẽ gặp phải loại rào cản mà bạn đề cập. Điều đó có vẻ giống như một con voi khá lớn để có trong phòng trong khi xem xét những gì Idris mất khi không hoàn thành Turing. Nó có mất nhiều hơn bất kỳ ngôn ngữ khác, ví dụ? Nếu bạn cấm lưu trữ ngoài không bị ràng buộc (ví dụ: chương trình dừng nói "vui lòng chèn đĩa tiếp theo / trước") thì bất kỳ ngôn ngữ nào đều không hoàn thành Turing-vì vậy mọi câu hỏi về trường hợp đó đều bị bỏ trống.
David Richerby

3
@DavidR Richby Nhận xét của tôi (nhưng không phải câu trả lời của tôi) ở chế độ lập trình lý thuyết ngôn ngữ lập trình. Nếu bạn lấy đặc tả chính thức của SML (ví dụ), có thể thiết kế (nhưng tất nhiên không triển khai trong thế giới vật lý), việc triển khai ngôn ngữ có thể mô phỏng tất cả các chương trình tính toán. Điều này không phải như vậy trong C, bởi vì độ chính xác của bộ nhớ được tích hợp vào ngôn ngữ ( sizeof(void*)). Trong câu trả lời của tôi, tôi đối xử với các ngôn ngữ theo cách lý tưởng hóa, vì vậy SML hoặc C sẽ được coi là hoàn thành Turing.
Gilles 'SO- ngừng trở nên xấu xa'
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.