Vì vậy, tôi đang cố gắng để có được vòng đầu Curry-Howard. (Tôi đã thử nó nhiều lần, nó chỉ không gelling / có vẻ quá trừu tượng). Để giải quyết vấn đề cụ thể, tôi đang làm việc thông qua một vài hướng dẫn của Haskell được liên kết từ wikipedia, đặc biệt là Tim Newsham . Cũng có một cuộc thảo luận hữu ích khi Newsham đăng bài hướng dẫn.
(Nhưng tôi sẽ bỏ qua các data
hàm bao của Newsham và Piponi , và nói về các loại cơ bản.) Chúng ta có sơ đồ tiên đề của Hilbert (được biểu thị dưới dạng các tổ hợp S , K ); chúng ta có các mệnh đề như các loại; hàm ý như hàm mũi tên; và Modus Ponens là ứng dụng chức năng:
axK :: p -> q -> p
axK = const
axS :: (p -> q -> r) -> (p -> q) -> p -> r
axS f g x = f x (g x)
modPons = ($); infixl 0 `modPons` -- infix Left, cp ($) is Right
Sau đó tôi có thể rút ra luật định danh:
ident = axS `modPons` axK `modPons` axK -- (S K K)
-- ident :: p -> p -- inferred
Có những kiểu này như kiểu chữ trần chỉ tương ứng với các mệnh đề có vẻ khá không tưởng tượng. Tôi có thể sử dụng nhiều hơn hệ thống loại để thực sự xây dựng các đề xuất không? Tôi đang nghĩ:
data IsNat n = IsNat !n -- [Note **]
data Z = Z
axNatZ :: IsNat Z
axNatZ = IsNat Z
data S n = S !n
axNatS :: IsNat n -> IsNat (S n)
axNatS (IsNat n) = IsNat (S n)
twoIsNat = axNatS `modPons` (axNatS `modPons` axNatZ)
-- ===> IsNat (S (S Z))
[Lưu ý **] Tôi đang sử dụng các nhà xây dựng nghiêm ngặt, theo chủ đề thảo luận, để tránh giới thiệu _ | _ .
Ở đâu:
IsNat
là một vị ngữ: đưa ra một đề xuất từ một thuật ngữ.n
là một biếnS
là một hàm, tạo một thuật ngữ từ một biến.Z
là một hằng số (hàm niladic).
Vì vậy, tôi dường như đã nhúng Logic dự đoán (thứ nhất)
Tôi đánh giá cao các loại của tôi không vệ sinh; Tôi có thể dễ dàng trộn lẫn một đề xuất typevar với một typevar-as-term. Có lẽ tôi nên sử dụng Kind
hệ thống để phân tách chúng. OTOH tiên đề của tôi sẽ phải là sai lầm ngoạn mục để đi đến bất kỳ kết luận.
Tôi chưa bày tỏ:
- định lượng phổ quát: nó ẩn cho các bình miễn phí;
- định lượng hiện sinh: các hằng số có hiệu lực có thể đóng vai trò là các tồn tại bị bỏ qua;
- sự bình đẳng của các điều khoản: Tôi đã sử dụng các kiểu chữ lặp đi lặp lại trong ý nghĩa;
- quan hệ: điều này dường như làm việc, hoặc nó là sai lầm? ...
data PlusNat n m l = PlusNat !n !m !l
axPlusNatZ :: IsNat m -> PlusNat Z m m
axPlusNatZ (IsNat m) = PlusNat Z m m
axPlusNatS :: PlusNat n m l -> PlusNat (S n) m (S l)
axPlusNatS (PlusNat n m l) = PlusNat (S n) m (S l)
plus123 = axPlusNatS `modPons`
(axPlusNatZ `modPons`
(axNatS `modPons` (axNatS `modPons` axNatZ)) )
-- ===> PlusNat (S Z) (S (S Z)) (S (S (S Z)))
Viết các tiên đề thật dễ dàng, lịch sự theo Định lý của Wadler miễn phí! . Viết các bằng chứng là công việc khó khăn. (Tôi sẽ bỏ modPons
và chỉ sử dụng ứng dụng chức năng.)
Đây có thực sự đạt được một logic. Hay là nó là thứ điên rồ? Tôi có nên dừng lại trước khi tôi làm hại thêm bộ não của mình không?
Bạn cần phải có các loại phụ thuộc để thể hiện FOPL trong Curry-Howard. Nhưng tôi dường như không làm điều đó (?)
IsNat
chỉ là một loại, do đó phải là một đề xuất. OK, bằng nhau IsNat n
chỉ là một loại vì vậy phải là một đề xuất. Tôi phải 'vì danh dự của mình' không được n
trốn vào vùng đất đề xuất / xuất hiện như một cuộc tranh luận với một liên kết logic (đó là lý do tại sao tôi nói về vệ sinh kiểu). Bạn có vui hơn không nếu tôi sử dụng mã hóa Church cho Nats? Tôi nghĩ rằng tôi chỉ mở rộng-calc với các nhà xây dựng ở cấp độ loại, giống như Haskell ở cấp độ hạn (?)
n
là một đề xuất : nó nói 'Tôi đang ở'. Đó là không nhiều hơn bất kỳ typevar đang nói theo CH. IsNat n
đang nói / chứng kiến: hơn nữa, cư dân n
của một loại 'đặc biệt', hay còn gọi là 'sắp xếp' theo logic. Sau đó, tôi sẽ vượt ra ngoài-calc (?)
IsNat
là không đưa ra một đề xuất từ một thuật ngữ, nó tạo ra một đề xuất từ một đề xuất .