Dato un termine t : ∀x.∃y.(¬(x = 0) ⇒ x = S(y))nella teoria dei tipi di Martin-Lof, qual è il valore w(t(0)), dov'è wl'operatore che estrae la testimonianza di un termine di tipo esistenziale?
Dato un termine t : ∀x.∃y.(¬(x = 0) ⇒ x = S(y))nella teoria dei tipi di Martin-Lof, qual è il valore w(t(0)), dov'è wl'operatore che estrae la testimonianza di un termine di tipo esistenziale?
Risposte:
Per dimostrare la risposta di Mark, considera la seguente prova tdella tua dichiarazione, scritta in Coq. Nella dimostrazione presupponiamo che venga fornito un parametro kdi tipo nat. Usiamo kcome valore ynel caso in cui 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.
Possiamo dimostrare che t 0è uguale a k:
Theorem A: projT1 (t 0) = k.
Proof.
auto.
Qed.
L' protT1è lì perché t 0non è solo un numero naturale, ma in realtà un numero naturale con una prova che 0 <> 0 -> 0 = S ye projT1getta via la prova.
Il codice Ocaml estratto per t, ottenuto con il 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))
Ancora una volta possiamo vedere che t 0è uguale a k, che era un parametro assunto aribtraneamente.