Tôi đang viết một luận văn đại học về tính hữu ích của các loại phụ thuộc. Tôi cố gắng để xây dựng một container, mà chỉ có thể được xây dựng thành một danh sách được sắp xếp, vì vậy mà nó được chứng minh được sắp xếp theo trình xây dựng:Danh sách được sắp xếp theo idris (loại sắp xếp)
import Data.So
mutual
data SortedList : (a : Type) -> {ord : Ord a) -> Type where
SNil : SortedList a
SMore : (ord : Ord a) => (el: a) -> (xs : SortedList a) -> So (canPrepend el xs) -> SortedList a
canPrepend : Ord a => a -> SortedList a -> Bool
canPrepend el SNil = True
canPrepend el (SMore x xs prf) = el <= x
SMore
đòi hỏi một bằng chứng runtime rằng phần tử được thêm vào phía trước là nhỏ hơn hoặc bằng hơn phần tử nhỏ nhất (đầu tiên) trong danh sách được sắp xếp.
Để sắp xếp một danh sách không được phân loại, tôi đã tạo ra một hàm sinsert
mà phải mất một danh sách được sắp xếp và chèn một phần tử và trả về một danh sách sắp xếp:
sinsert : (ord : Ord a) => SortedList a {ord} -> a -> SortedList a {ord}
sinsert SNil el = SMore el SNil Oh
sinsert (SMore x xs prf) el = either
(\p =>
-- if el <= x we can prepend it directly
SMore el (SMore x xs prf) p
)
(\np =>
-- if not (el <= x) then we have to insert it in the tail somewhere
-- does not (el <= x) imply el > x ???
-- we construct a new tail by inserting el into xs
let (SMore nx nxs nprf) = (sinsert xs el) in
-- we get two cases:
-- 1) el was prepended to xs and is now the
-- smalest element in the new tail
-- we know that el == nx
-- therefor we can substitute el with nx
-- and we get nx > x and this also means
-- x < nx and also x <= nx and we can
-- prepend x to the new tail
-- 2) el was inserted somewhere deeper in the
-- tail. The first element of the new tail
-- nx is the same as it was in the original
-- tail, therefor we can prepend x to the
-- new tail based on the old proof `prf`
either
(\pp =>
SMore x (SMore nx nxs nprf) ?iins21
)
(\npp =>
SMore x (SMore nx nxs nprf) ?iins22
) (choose (el == nx))
) (choose (el <= x))
tôi đang gặp khó khăn xây dựng chứng minh (?iins21
, ?iins22
) và tôi sẽ đánh giá cao một số trợ giúp. Tôi có thể dựa vào một giả định không giữ, nhưng tôi không thấy nó.
Tôi cũng muốn khuyến khích bạn để cung cấp một giải pháp tốt hơn cho việc xây dựng một danh sách sắp xếp (có thể là một danh sách bình thường với một giá trị bằng chứng cho thấy nó được sắp xếp?)
Tôi có câu trả lời trong Agda, tôi có nên đăng không? – user3237465
Tôi không nghĩ rằng bạn sẽ có thể viết các bằng chứng này vì loại 'SortedList' của bạn quá [mù] (https://existentialtype.wordpress.com/2011/03/15/boolean-blindness/) đến phức tạp của đặt hàng. Ví dụ, bạn không thể chứng minh một cái gì đó như 'transitivity: Ord a => {x: a} -> Vì vậy, (x <= y) -> Vì vậy, (y <= z) -> Vì vậy, (x <= z)' khi 'Ord' typeclass không có – Cactus
Bạn có thể nhận được nhiều hơn nữa bằng cách sửa 'a' thành' Nat' và sử dụng mệnh đề như 'x \' LTE \ 'y' thay vì' So (x <= y) '. – Cactus