В случае Just
во второй попытке благодаря рекурсии у вас есть доказательство того, что LTE k n
, но, как вы заявляете, вам нужно LTE (S k) (S n)
. Вы можете найти пропущенный шаг двумя способами. Поиск в REPL для функции этого типа:
Idris> :search LTE k n -> LTE (S k) (S n)
= Prelude.Nat.LTESucc : LTE left right -> LTE (S left) (S right)
If n <= m, then n + 1 <= m + 1
или даже проще, используйте пробный поиск через REPL или редактор (я могу просто использовать <space>p
для решения ?hole
, что является лучшей функцией в Idris IMO!). Это также приведет к
smallerThan (S k) (S n) = case smallerThan k n of
Nothing => Nothing
Just lte => Just (LTESucc lte)
Кроме того, isLTE
равно smallerThan
только с более мощным Dec
, чем Maybe
, потому что в отрицательном случае вы получите доказательство того, что k
не меньше или равно n
. Таким образом, isLTE
не содержит ошибок, в то время как smallerThan
может всегда возвращать Nothing
.
. Вы можете использовать это в вызывающей функции dummy
, например:
foo : Nat -> Nat -> Nat
foo x y = case isLTE x y of
Yes prf => dummy x y
No contra => Z