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'è w
l'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'è w
l'operatore che estrae la testimonianza di un termine di tipo esistenziale?
Risposte:
Per dimostrare la risposta di Mark, considera la seguente prova t
della tua dichiarazione, scritta in Coq. Nella dimostrazione presupponiamo che venga fornito un parametro k
di tipo nat
. Usiamo k
come valore y
nel 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 0
non è solo un numero naturale, ma in realtà un numero naturale con una prova che 0 <> 0 -> 0 = S y
e projT1
getta 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.