Я играю в Coq, пытаясь создать отсортированный список. Мне просто нужна функция, которая берет список [1,2,3,2,4]
и возвращает что-то вроде Sorted [1,2,3,4]
, т.е. удаляет плохие части, но не сортирует весь список.
Я подумал, что начну с определения функции lesseq
типа (m n : nat) -> option (m <= n)
, а затем смогу довольно легко сопоставлять ее с образцом. Может быть, это плохая идея.
Суть проблемы, с которой я сейчас сталкиваюсь, заключается в том, что (фрагмент, вся функция внизу)
Fixpoint lesseq (m n : nat) : option (m <= n) :=
match m with
| 0 => match n with
| 0 => Some (le_n 0)
...
не проверяет тип; он говорит, что ожидает option (m <= n)
, но Some (le_n 0)
имеет тип option (0 <= 0)
. Я не понимаю, потому что очевидно, что и m
, и n
равны нулю в этом контексте, но я понятия не имею, как сказать об этом Coq.
Вся функция такова:
Fixpoint lesseq (m n : nat) : option (m <= n) :=
match m with
| 0 => match n with
| 0 => Some (le_n 0)
| S n_ => None
end
| S m_ => match n with
| 0 => None
| S _ => match lesseq m_ n with
| Some x=> le_S m n x
| None => None
end
end
end.
Возможно, я забегаю вперед, и мне просто нужно продолжать читать, прежде чем я займусь этим.