Đầ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 là 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 total
kế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ừ).