Я играю в 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.
Возможно, я забегаю вперед, и мне просто нужно продолжать читать, прежде чем я займусь этим.