Hệ thống F có thể không tính toán những chức năng nào?


28

Trong bài viết trên wikipedia về Turing Hoàn thiện này có ghi rằng:

Phép tính lambda chưa được đánh dấu là Turing hoàn chỉnh, nhưng nhiều phép tính lambda được gõ, bao gồm cả Hệ thống F, thì không. Giá trị của các hệ thống được nhập dựa trên khả năng của chúng để đại diện cho hầu hết các chương trình máy tính điển hình trong khi phát hiện thêm lỗi.

Một ví dụ về tổng hàm tính toán không thể tính toán được bởi hệ thống F là gì?

Ngoài ra, vì hindley-milner là:

Một hạn chế của Hệ thống F

vì thực tế rằng:

kiểm tra kiểu là không thể áp dụng cho một biến thể kiểu F của Curry, nghĩa là, một biến thể thiếu chú thích gõ rõ ràng.

Điều này có nghĩa là tính toán lambda bên dưới các hệ thống loại hindley-milner không hoàn thành tốt?

Nếu điều này là đúng, vì haskell hoàn toàn rõ ràng và chúng ta biết rằng cơ sở của nó là tính toán lambda và hệ thống loại hindley-milner, những tính năng nào không có trong tính toán lambda được thêm vào để làm cho haskell hoàn thành?



Ví dụ về tính năng làm cho Haskell turing hoàn thành là giao diện mã gốc.
Trismegistos

@cody cảm ơn bình luận của bạn. Tôi không quen thuộc với hệ thống T. Tôi có đúng không khi cho rằng đó là hệ thống T được đề cập ở đây ? hệ thống T so sánh và tương phản với hệ thống F như thế nào?
Mike HR

LƯU Ý, trên googling cho system T vs. system Ftôi đã tìm thấy một cái gì đó trả lời câu hỏi con cuối cùng của tôi được nhắc lại ở đây như: Làm thế nào mà haskell thêm Turing-đầy đủ vào Hệ thống F
Mike HR

1
Tôi nghĩ rằng @Trismegistos đặt ra một vấn đề triết học thú vị: chính xác thì Haskell là gì, ranh giới của nó ở đâu?
Martin Berger

Câu trả lời:


45

Hệ thống khá biểu cảm. Như được chứng minh bởi Girard ở đây , các hàm của loại (trong đó được định nghĩa là ) chính xác là các hàm có thể xác định ( ) theo thứ tự thứ hai Heyting Arithatures . Lưu ý rằng điều này giống như các hàm có thể xác định theo thứ tự số học Peano thứ hai .FNNNX. X(XX)XNNHA2

Có lẽ bạn sẽ muốn kiểm tra Bằng chứng và Loại như một tài liệu tham khảo dễ đọc hơn. Lưu ý rằng điều này có nghĩa là rất nhiều chương trình có thể được viết trong hệ thống F, từ chức năng Ackermann đến trình thông dịch cho hệ thống của Gôdel . Đối với bất kỳ ngôn ngữ lập trình tổng thể nào (với một số điều kiện nhẹ), hệ thống không thể thực hiện trình thông dịch tự , tức là một hàm dùng mã đầu vào cho một thuật ngữ của hệ thống và trả về một (mã cho a) dạng bình thường choTFeval:NNtFt. Bằng chứng liên quan đến một biến thể của thủ thuật chéo được sử dụng cho tính không ổn định của vấn đề tạm dừng. Andrej giải thích nó rất hay ở đây .

Để trả lời các câu hỏi khác của bạn: -calculus nằm dưới các ngôn ngữ Hindley-Milner (HM) cũng chưa hoàn thành. Trong thực tế, nó yếu hơn đáng kể so với hệ thống , gần hơn về tính biểu cảm với -calculus được gõ đơn giản .λF λ

Haskell thực sự là Turing hoàn thành. Tính năng đặc biệt nhất cho phép điều này (mặc dù có những thứ khác) là sự hiện diện của đệ quy không giới hạn : định nghĩa của bất kỳ chương trình (chức năng) nào cũng có thể đề cập đến chính chương trình. Điều này tương tự như việc bổ sung bộ kết hợp , như được thực hiện trong định nghĩa của PCF , được gõ đơn giản nhưng vẫn giữ nguyên tính hoàn chỉnh Turing với bộ kết hợpYY

Lưu ý rằng có các tính năng khác làm cho Haskell Turing hoàn chỉnh, nhưng chúng thường không được coi là một phần của ngôn ngữ cốt lõi, ví dụ: tham chiếu đến các hàm, kiểu dữ liệu không bị hạn chế, v.v.


1
Wow, đây là một câu trả lời tuyệt vời và trả lời mọi thứ hoàn hảo. Cảm ơn bạn!
Mike HR

"Đối với bất kỳ ngôn ngữ lập trình tổng thể nào ..." Điều này không hoàn toàn chính xác. Theo sự hiểu biết của tôi, có một số trình thông dịch cho toàn bộ ngôn ngữ hoạt động bằng cách loại trừ các chương trình không kết thúc là không hợp lệ, theo sự hiểu biết của tôi. Xem bài viết này
jmite

@jmite như đã nêu, yêu cầu của tôi là đúng. Bài báo đó được đề cập trong cuộc thảo luận được liên kết và Andrej có một số nhận xét tiếp theo trên blog của mình: math.andrej.com/2016/01/04/ Kẻ
cody

11

Thật là sai lầm khi nói rằng hệ thống gõ của Haskell là "hệ thống kiểu hinley-milner". Các loại của Haskell mạnh hơn nhiều, bao gồm, trong số các loại khác, loại cao hơn. Thật vậy, hệ thống gõ mạnh đến mức bạn có thể nhúng các ngôn ngữ lập trình Turing-Complete vào hệ thống gõ, xem tại đây . Đây không phải là lý do duy nhất cho sức mạnh của Haskell, Cody đã đề cập đến một số người khác.


Cảm ơn. tiếp xúc chính của tôi với hindley-milner đã thông qua haskell vì vậy tôi đoán tôi có thể đã giả định rằng các loại loại cao hơn là một phần của nó. Có phải hindley-milner chỉ đơn giản đề cập đến loại suy luận (vì vậy rất có thể là thuật toán W)? hoặc là một cái gì đó nhiều hơn? Tôi hiểu rằng có cơ sở toán học của nó trong phép tính lambda, tôi chỉ đang cố gắng hiểu ranh giới logic giữa hệ thống loại mạnh mẽ của haskell và việc triển khai tối thiểu "hệ thống loại hindley-milner" sẽ là gì.
Mike HR

Lưu ý Nếu bất kỳ ai quan tâm đến sức mạnh của hệ thống loại haskell, tôi muốn giới thiệu video của Edward Kmett về hask , đi sâu vào lý thuyết thể loại bằng hệ thống loại haskell.
Mike HR

1
@ MikeH-R Thông thường, chúng tôi muốn nói rằng HindleyTHER Milner là một hệ thống gõ hoặc chính xác hơn là gõ -calculus, trong khi thuật toán là thuật toán suy luận kiểu cho hệ thống Hindley của Milner. Điều đáng chú ý về hệ thống Hindley-Milner là nó kết hợp đa hình tham số với khả năng suy ra loại chung nhất của bất kỳ chương trình nào mà không có chú thích kiểu. Các bài viết trên Wikipedia là đáng đọc. λW
Martin Berger
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.