Lemma odd_pred2n: forall n : nat, Even.odd n -> {p : nat | n = pred (Div2.double p)}.
Lemma even_2n : forall n, even n -> {p : nat | n = double p}.
Lemma even_odd_exists_dec:forall n, {p : nat | n = Div2.double p} + {p : nat | n = pred (Div2.double p)}.
Proof.
intro n.
destruct (Even.even_odd_dec n) as [H_parity|H_parity];
[ left; apply (Div2.even_2n _ H_parity)
| right; apply (odd_pred2n _ H_parity)].
Defined.
Definition nat_to_Z_i (n:nat) :=
match even_odd_exists_dec n with
| inl s => let (k, _) := s in Z_of_nat k
| inr s => let (k, _) := s in Zopp (Z_of_nat k)
end.
Как это определение определяет инъекцию от nat
до Z
? И что такое inl
, inr
и что делает let
здесь?Как этот код выполняет требуемую функцию?
Является ли это домашнее задание? –