Respostas:
Para demonstrar a resposta de Mark, considere a seguinte prova t
de sua declaração, escrita em Coq. Na prova, assumimos que um parâmetro k
do tipo nat
é fornecido. Usamos k
como valor de y
caso x = 0
:
Parameter k : nat.
Theorem t : forall x : nat, { y : nat | x <> 0 -> x = S y}.
Proof.
induction x.
exists k; tauto.
induction x.
exists 0; auto.
destruct IHx as [z G].
exists (S z).
intro H.
elim G; auto.
Defined.
Podemos provar que t 0
é igual a k
:
Theorem A: projT1 (t 0) = k.
Proof.
auto.
Qed.
O protT1
está lá porque t 0
não é apenas um número natural, mas na verdade um número natural com uma prova de que 0 <> 0 -> 0 = S y
e projT1
joga fora a prova.
O código Ocaml extraído para t
, obtido com o comando Extraction k
é
(** val t : nat -> nat **)
let rec t = function
| O -> k
| S n0 -> (match n0 with
| O -> O
| S n1 -> S (t n0))
Novamente, podemos ver que t 0
é igual a k
, que era um parâmetro assumido arbitrariamente.