Ваш код не работает
Fixpoint count (v : nat) (xs : natlist) : nat :=
match xs with
| nil => 0
| h :: t =>
match beq_nat h v with
| true => 1 + count v xs (*will not compile since "count v xs" is not simply recursive*)
| false => count v xs
end
end.
вы, вероятно, имели в виду
Fixpoint count (v : nat) (xs : natlist) : nat :=
match xs with
| nil => 0
| h :: t =>
match beq_nat h v with
| true => 1 + count v t
| false => count v t
end
end.
Использование destruct
- это отличный способ получить ваше решение. Но вам нужно помнить несколько вещей
destruct
является синтаксическим, то есть заменяет термины, выраженные в вашей цели / предположениях. Итак, обычно вам нужно что-то вроде simpl
(работает здесь) или unfold
сначала.
- порядок терминов имеет значение.
destruct (beq_nat n y)
- это не то же самое, что destruct (beq_nat y n)
. В этом случае вы хотите второй из этих
Обычно проблема в том, что destruct
тупой, поэтому вы должны делать смарты самостоятельно.
В любом случае, начните доказательство
intros n y xs. simpl. destruct (beq_nat y n).
И все будет хорошо.