Tôi đang thử nghiệm các hệ thống loại thuần túy trong khối lambda của Barendregt, đặc biệt với hệ thống mạnh nhất, Giải tích các công trình. Hệ thống này có các loại *và BOX. Chỉ để ghi lại, bên dưới tôi đang sử dụng cú pháp cụ thể của Mortecông cụ https://github.com/Gabriel439/Haskell-Morte-L Library gần với phép tính lambda cổ điển.
Tôi thấy chúng ta có thể mô phỏng các kiểu quy nạp bằng một số loại mã hóa giống như Giáo hội (hay còn gọi là đẳng cấu Boehm-Berarducci cho các kiểu dữ liệu đại số). Đối với một ví dụ đơn giản, tôi sử dụng kiểu Bool = ∀(t : *) -> t -> t -> tvới các hàm tạo True = λ(t : *) -> λ(x : t) -> λ(y : t) -> xvà False = λ(t : *) -> λ(x : t) -> λ(y : t) -> y.
Tôi thấy rằng loại hàm cấp độ hạn Bool -> Tlà đẳng cấu với các cặp loại Product T Tcó Product = λ(A : *) -> λ(B : *) -> ∀(t : *) -> (A -> B -> t) -> ttham số modulo cổ điển bằng phương tiện của hàm if : Bool -> λ(t : *) -> t -> t -> ttrong thực tế là nhận dạng.
Tất cả các câu hỏi dưới đây sẽ là về đại diện của các loại phụ thuộc Bool -> *.
Tôi có thể chia
D : Bool -> *thành cặpD TruevàD False. Có cách nào hợp quy để tạoDlại không? Tôi muốn tái tạo isomosphismBool -> T = Product T Tbằng một dạng tương tự của hàmifở cấp độ loại nhưng tôi không thể viết hàm này đơn giản như ban đầuifvì chúng ta không thể truyền các loại trong các đối số như các loại.Tôi sử dụng một loại quy nạp có hai cuộn cảm để giải câu hỏi (1). Mô tả cấp độ cao (kiểu Agda) là loại sau (được sử dụng thay cho cấp độ loại
if)data BoolDep (T : *) (F : *) : Bool -> * where DepTrue : T -> BoolDep T F True DepFalse : F -> BoolDep T F Falsevới mã hóa sau trong PTS / CoC:
λ(T : *) -> λ(F : *) -> λ(bool : Bool ) -> ∀(P : Bool -> *) -> ∀(DepTrue : T -> P True ) -> ∀(DepFalse : F -> P False ) -> P boolLà mã hóa của tôi ở trên là chính xác?
Tôi có thể viết ra các hàm tạo
BoolDepnhư mã này choDepTrue : ∀(T : *) -> ∀(F : *) -> T -> BoolDep T F True:λ(T : *) -> λ(F : *) -> λ(arg : T ) -> λ(P : Bool -> *) -> λ(DepTrue : T -> P True ) -> λ(DepFalse : F -> P False ) -> DepTrue arg
nhưng tôi không thể viết ra hàm nghịch đảo (hoặc bất kỳ hàm nào theo hướng ngược lại). Có thể không? Hay tôi nên sử dụng một đại diện khác BoolDepđể tạo ra một đẳng cấu BoolDep T F True = T?