EDIT: Một bình luận ở trên đã cung cấp phần còn thiếu. Một số người đang cố tình chơi với các ngôn ngữ chưa hoàn chỉnh. Tôi rõ ràng không quan tâm đến các ngôn ngữ như vậy. Một ngôn ngữ không thực sự hữu dụng có thể sử dụng được là một điều khó khăn để thiết kế. Toàn bộ phần còn lại của điều này mở rộng về những gì xảy ra khi cố gắng áp dụng các định lý này vào một ngôn ngữ đầy đủ.
Sai!
function f(a): forall t: Type, t->t
function g(a): forall t: Type, t->t
return (a is g) ? f : a
return a is f ? g : a
trong đó is
toán tử so sánh hai biến để nhận dạng tham chiếu. Đó là, chúng chứa cùng một giá trị. Không phải là một giá trị tương đương, cùng một giá trị. Các hàm f
và g
tương đương theo một số định nghĩa nhưng chúng không giống nhau.
Nếu chức năng này được thông qua chính nó sẽ trả về một cái gì đó khác; nếu không, nó trả về đầu vào của nó. Một cái gì đó khác có cùng loại với chính nó do đó nó có thể được thay thế. Nói cách khác, f
không phải là danh tính, bởi vì f(f)
trả về g
, trong khi danh tính sẽ trở lại f
.
Đối với định lý để giữ nó phải giả sử khả năng vô lý để giảm
function cantor(n, <z, a>) : forall t: t: Type int, <int, t> -> <int, t>
return n > 1 ? cantor((n % 2 > 0) ? (n + 1) : n / 2, <z + 1, a>) : <z, a>
return cantor(1000, <0, a>)[1]¹
Nếu bạn sẵn sàng cho rằng bạn có thể giả sử loại suy luận dễ dàng hơn nhiều có thể được xử lý.
Nếu chúng ta cố gắng hạn chế miền cho đến khi định lý được giữ, cuối cùng chúng ta sẽ phải hạn chế miền quá xa.
- Chức năng thuần túy (không có trạng thái đột biến, không có IO). OK tôi có thể sống với điều đó. Rất nhiều thời gian chúng tôi muốn chạy bằng chứng về các chức năng.
- Thư viện tiêu chuẩn trống. ồ
- Không
raise
và không exit
. Bây giờ chúng tôi bắt đầu bị hạn chế.
- Không có loại đáy.
- Ngôn ngữ có một quy tắc cho phép trình biên dịch thu gọn đệ quy vô hạn bằng cách giả sử nó phải chấm dứt. Trình biên dịch được phép từ chối đệ quy vô hạn tầm thường.
- Trình biên dịch được phép thất bại nếu được trình bày với một cái gì đó không thể được chứng minh bằng cách nào .² Bây giờ thư viện chuẩn không thể lấy các hàm làm đối số. Boo.
- Không có
nil
. Điều này đang bắt đầu có vấn đề. Chúng tôi đã hết cách để đối phó với 1 / 0.³
- Ngôn ngữ không thể thực hiện suy luận kiểu nhánh và không có ghi đè khi lập trình viên có thể chứng minh loại suy luận ngôn ngữ không thể. Điều này là khá xấu.
Sự tồn tại của cả hai ràng buộc cuối cùng đã làm tê liệt ngôn ngữ. Mặc dù Turing vẫn hoàn thành cách duy nhất để có được công việc có mục đích chung là mô phỏng một nền tảng bên trong diễn giải một ngôn ngữ với các yêu cầu lỏng lẻo hơn.
Nếu bạn nghĩ trình biên dịch có thể suy ra cái đó, hãy thử cái này
function fermat(z) : int -> int
function pow(x, p)
return p = 0 ? 1 : x * pow(x, p - 1)
function f2(x, y, z) : int, int, int -> <int, int>
left = pow(x, 5) + pow(y, 5)
right = pow(z, 5)
return left = right
? <x, y>
: pow(x, 5) < right
? f2(x + 1, y, z)
: pow(y, 5) < right
? f2(2, y + 1, z)
: f2(2, 2, z + 1)
return f2(2, 2, z)
function cantor(n, <z, a>) : forall t: t: Type int, <int, t> -> <int, t>
return n > 1 ? cantor((n % 2 > 0) ? (n + 1) : n / 2, <z + 1, a>) : <z, a>
return cantor(fermat(3)[0], <0, a>)[1]
² Bằng chứng cho thấy trình biên dịch không thể làm điều này phụ thuộc vào chói mắt. Chúng tôi có thể sử dụng nhiều thư viện để đảm bảo trình biên dịch không thể nhìn thấy vòng lặp cùng một lúc. Ngoài ra, chúng ta luôn có thể xây dựng một cái gì đó mà chương trình sẽ hoạt động nhưng không thể được biên dịch vì trình biên dịch không thể thực hiện cảm ứng trong bộ nhớ khả dụng.
Ai đó nghĩ rằng bạn có thể có con số hoàn trả này mà không có loại chung chung tùy ý trả về con số không. Điều này trả một hình phạt khó chịu mà tôi đã thấy không có ngôn ngữ hiệu quả có thể trả nó.
function f(a, b, c): t: Type: t[],int,int->t
return a[b/c]
không được biên dịch. Vấn đề cơ bản là lập chỉ mục mảng thời gian chạy không hoạt động nữa.