Đơn giản chỉ cần gõ logic kết hợp?


8

Vì có một phép tính lambda chưa được gõ và một phép tính lambda được gõ đơn giản (như được mô tả, ví dụ, trong các loại sách và Ngôn ngữ lập trình của Benjamin Pierce), liệu có một logic kết hợp đơn giản nào được gõ không?

Ví dụ, dường như các loại tự nhiên cho các tổ hợp S, K và tôi sẽ là

S : (a -> b -> c) -> (a -> b) -> a -> c
K : a -> b -> a
I : a -> a

trong đó a, b và c là các biến loại nằm trong một số loại T. Bây giờ, có lẽ chúng ta có thể bắt đầu với một loại cơ sở duy nhất, Bool. Tập hợp các loại T của chúng tôi sau đó là Bool cùng với bất kỳ loại nào có thể được hình thành bằng cách sử dụng ba mẫu

(a -> b -> c) -> (a -> b) -> a -> c
a -> b -> a
a -> a

trong đó a, b, c ở T.

Sẽ có hai hằng số mới trong ngôn ngữ.

T : Bool
F : Bool

Vì vậy, ngôn ngữ này bao gồm các ký hiệu S, K, I, T và F, cùng với dấu ngoặc đơn. Nó có một loại Bool cơ sở và "các loại hàm" có thể được tạo từ các mẫu tổ hợp S, K và I.

Hệ thống này có thể được thực hiện để làm việc? Ví dụ, có một cấu trúc if-then-other được gõ tốt có thể được hình thành từ chỉ S, K, I, T, F không?


Tra cứu "đại số kết hợp gõ".
Andrej Bauer

Thật thú vị, logic kết hợp được gõ là nơi mà sự tương ứng "Curry-Howard" không được biết đến lần đầu tiên được chú ý, do sự tương đồng với các tiên đề logic kiểu Hilbert: en.wikipedia.org/wiki/Hilbert_system#Logical_axioms
cody

Câu trả lời:


11

Lưu ý nhanh chóng, tôi cho phép đa hình tham số (Hệ thống F) trong hệ thống này để S, KIcó thể làm việc trên tất cả các loại.

Lưu ý rằng không có khớp mẫu, chúng ta không thể viết ifbất kể chúng ta làm gì. Chúng tôi hoàn toàn không có hoạt động trên booleans. Không có cách nào để phân biệt Truetừ False. Thay vào đó hãy thử

true : a -> a -> a
true = \t -> \f -> t

false : a -> a -> a
false = \t -> \f -> f

Hãy để Bool = a -> a -> acho rõ ràng.

 if : Bool -> a -> a -> a
 if = \bool -> \a -> \b -> bool a b

Bây giờ chỉ là vấn đề biên dịch một số biểu thức tính toán lambda cho các tổ hợp, điều này khá tầm thường.

if : Bool -> a -> a -> a -- Or just Bool -> Bool
if    = I

true : a -> a -> a
true  = K

false : a -> a -> a
false = K I
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.