У меня есть вопрос, похожий на Разложение равенства конструкторов coq , однако мое равенство содержит выражение match
. Рассмотрим пример (который бессмыслен, но используется только для пояснения):
Fixpoint positive (n : nat) :=
match n with
| O => Some O
| S n => match positive n with
| Some n => Some (S n)
| None => None (* Note that this never happens *)
end
end.
Lemma positiveness : forall n : nat, Some (S n) = positive (S n).
Proof.
intro.
simpl.
На данный момент, с n : nat
в окружающей среде, цель:
Some (S n) =
match positive n with
| Some n0 => Some (S n0)
| None => None
end
Я хочу преобразовать это в две подцели в среде n, n0 : nat
:
positive n = Some n0 (* Verifying the match *)
S n = S n0 (* Verifying the result *)
И я ожидал бы, что если match
для доказательства равенства имеет несколько случаев, которые могут сработать, новая цель - это дизъюнкция всех возможностей, например, для
Some (S n) =
match positive n with
| Some (S n0) => Some (S (S n0))
| Some O => Some (S O)
| None => None
end
Я бы ожидал
(positive n = Some (S n0) /\ S n = S (S n0)) (* First alternative *)
\/ (positive n = Some O /\ S n = S O) (* Second alternative *)
Есть ли тактика Coq, которая делает это или что-то подобное?