Я пишу магистерскую диссертацию о полезности зависимых типов. Я пытаюсь построить контейнер, который может быть создан только в отсортированном списке, так что он проверен по конструкции:
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
требует проверки времени выполнения, что добавляемый элемент меньше или равен наименьшему (первому) элементу в отсортированном списке.
Чтобы отсортировать несортированный список, я создал функцию sinsert
, которая принимает отсортированный список и вставляет элемент и возвращает отсортированный список:
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))
У меня возникли проблемы с построением доказательств (?iins21
, ?iins22
), и я был бы признателен за некоторую помощь. Я могу полагаться на предположение, которое не выполняется, но я этого не вижу.
Я также хотел бы предложить вам создать лучшее решение для построения отсортированного списка (может быть, обычный список с доказательным значением, который он сортирует?)